成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

編譯原理助我脫坑

開發 前端
折騰了幾天之后發現按照窮舉法去發現所有的異常case實在是太難了,因為我們的精力是有限的,一時半會無法想到所有的case,那有沒有什么辦法呢?

一、背景

有一個需求,需要將源碼提供出去,交予三方進行安全審核,為了減少代碼泄漏帶來的影響,要求將

  1. 自己的源碼中要有代碼注釋
  2. 對外提供的代碼中,將所有的代碼注釋移除,增加其他人的代碼閱讀難度

二、艱難的爬坑過程

1、整理java中的注釋情形

多行注釋:
/**
多行注釋
*/
  • 單行注釋:
// 單行注釋

2、初步入坑

對上一步的情況分析后簡單的結論,

  1. 以 /* 開頭,以*/結尾
  2. 以 //開頭,以換行或者文件結束 結尾

3、核心代碼

  • 獲取多行注釋內容的代碼
re.findall("\/\*.*?\*\/", content, re.S)
  • 按行遍歷文件,檢查是否包含 “//”,如果包含就將 “//”及以后的內容替換為換行
re.findall("\/\/.*", line, re.S)

4、進入大坑

本以為這樣是一個簡單粗暴的方法,真正跑起來之后發現有較大問題

  • 字符串中包含 多行和單行 注釋的話,就會導致字符串內的內容被修改
  • 單行被錯誤移除
"(?m)^//.*(?=\\n)"
  • 單行注釋移除異常
// 后面有一個單獨的 “ ,引號的排查優先級高,導致這個引號被保留,導致整體移除異常
  • 字符串的識別遇到問題
‘“’
"select * from user where name = 'root'"
“\"” 
  • 中間的引號不能作為字符串的開始和結尾
  • 最后的雙引號需要算做字符串的結尾
  • 這樣的不能當作雙引號,也就是這樣的不能作為字符串的開始和結尾

三、回頭是岸

有時候捷徑不是最快的路徑。

折騰了幾天之后發現按照窮舉法去發現所有的異常case實在是太難了,因為我們的精力是有限的,一時半會無法想到所有的case,那有沒有什么辦法呢?

這個時候記憶深處的一些內容開始冒泡泡,程序員的三大浪漫之一的 編譯原理 開始出現了。

之前懵懵懂懂讀過的文本開始有一點點印象了。重新翻開經典之作的內容,看看他是怎么來處理詞法和語法的。

1、回顧編譯原理

  1. 詞法分析,程序中的單詞大體可以分成五類:

圖片

  1. 語法分析,比如,對于賦值語句??position = initial + 2 * 60??,經過語法分析后生成的樹

圖片

  1. 語義分析,比如??position = initial + 2 * 60?? 經過語義分析后

圖片

2、著手處理

按照編譯原理中講的過程,要先一個的拆成詞,然后將詞串成語句,然后一個語句一個語句的處理。

整體的思路:

  • 判斷是否已經在不用關注的范圍內,例如在 雙引號中間的,在多行注釋中的,在單行注釋后面的
  • 如果已經開始了,就只用關注是否是雙引號、多行注釋、單行注釋的結尾
  • 如果是結尾,就分別處理,
  • 多行注釋的刪除
  • 單行注釋的刪除
  • 雙引號中間的保留
  1. 在雙引號、多行注釋、單行注釋開始的時候,把前一次的給保存到新文件中

3、代碼

# coding=utf-8
foler_path = "./java/test/"

def rewriteContent(dirpath, filename, content):
writefile = open(dirpath + "/" + filename, "w+")
# print content
writefile.write(content)
writefile.close()



def clean_all_note():
for dirpath, dirnanes, filenams in os.walk(foler_path):
for filename in filenams:
print dirpath + "/" + filename
clean_note(dirpath, filename)

#判斷是否是雙引號,需要排除 '"' 和 \" 的情況,
def is_available_quotes(ch, pre_ch,next_ch):
return ch == "\"" and pre_ch != "\\" and not (pre_ch == "'" and next_ch == "'")

#判斷是否是多行注釋的開頭 即 /*
def is_prefix_multiline_comment(ch, pre_ch):
return ch == "*" and pre_ch == "/"

#判斷是否是多行注釋的結尾,即 */
def is_suffix_multiline_comment(ch, pre_ch):
return ch == "/" and pre_ch == "*"

#判斷是否是單行注釋 //
def is_single_line_comment(ch, pre_ch):
return ch == "/" and pre_ch == "/"

# 判斷是否是換行
def is_line_feed(ch, pre_ch):
return ch == "\n"


def clean_note(dirpath, filename):
file = open(dirpath + "/" + filename, "r+")
content = file.read()
multiline_ing = False
single_line_ing = False
quotes_ing = False
pre_ch = ""
index = 0
lastPoi = 0
newContent = ""
for ch in content:
if multiline_ing:
if is_suffix_multiline_comment(ch,pre_ch):
# print "m l e:" + pre_ch + ch
lastPoi = index+1
multiline_ing = False
elif single_line_ing:
if is_line_feed(ch,pre_ch) or index == len(content)-1:
# print "s l e:" + content[lastPoi:index-1]
lastPoi = index
single_line_ing = False
elif quotes_ing:
#解決 "\\"
if ch == "\\" and pre_ch == "\\":
ch = ''
if is_available_quotes(ch, pre_ch,content[index+1]):
# print "yinhao e :" + pre_ch + ch
newContent = newContent + content[lastPoi:index]
lastPoi = index
quotes_ing = False
else:
if index == len(content)-1:
# print "e s :" + pre_ch + ch
newContent = newContent + content[lastPoi:index+1]
elif is_available_quotes(ch, pre_ch,content[index+1]):
# print "yinhao s :" + pre_ch + ch
# newContent = newContent + content[lastPoi:index]+"----"
quotes_ing = True
elif is_prefix_multiline_comment(ch, pre_ch):
# print "m l s :" + pre_ch + ch
newContent = newContent + content[lastPoi:index-1]
multiline_ing = True
elif is_single_line_comment(ch, pre_ch):
# print "s l s :" + pre_ch + ch
newContent = newContent + content[lastPoi:index-1]
single_line_ing = True

index = index+1
pre_ch = ch
rewriteContent(dirpath, filename, newContent)





if __name__ == '__main__':
for dirpath, dirnanes, filenams in os.walk(foler_path):
for filename in filenams:
clean_note(dirpath, filename)


責任編輯:武曉燕 來源: arige
相關推薦

2020-09-14 08:56:30

Vue模板

2016-06-02 09:03:48

2019-11-15 15:20:27

Golang編譯器前端

2021-08-16 07:11:56

Go語言進程

2017-04-11 08:36:09

iOS編譯應用

2023-05-08 08:05:42

內核模塊Linux

2023-04-27 08:35:20

Webpack 4性能優化

2009-05-08 11:49:57

2017-02-07 14:40:24

2009-12-09 15:11:57

PHP圖標類JpGra

2021-07-05 08:41:49

RedisGEO系統

2022-06-10 10:39:44

分布式事務模式

2017-02-22 14:09:31

Javaforeach反編譯

2011-09-10 21:05:04

密碼管理瀏覽器插件

2022-06-19 23:20:47

區塊鏈氣候VCM

2021-04-02 15:18:13

智慧城市物聯網

2022-11-09 15:06:43

人工智能

2022-06-01 21:23:12

ELKLogstash底層

2020-12-01 10:26:37

物聯網大數據IOT

2011-05-11 10:13:16

數據庫加密脫密
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色免费视频 | 精品亚洲一区二区三区 | 成人免费大片黄在线播放 | 成人在线电影网站 | 亚洲第一视频 | 久久综合久 | 欧美在线a | 日日摸日日碰夜夜爽2015电影 | 在线免费观看黄网 | 日韩av手机在线观看 | 天天草天天操 | 久久精品播放 | 91精品福利 | 国产欧美日韩综合精品一区二区 | 中文字幕第一页在线 | 国产精品久久一区 | 国产欧美一区二区三区久久人妖 | 国内久久精品 | 国产小视频在线观看 | 国产成人区 | 亚洲国产一区在线 | 1000部精品久久久久久久久 | 成人午夜免费视频 | 日韩在线欧美 | 欧美99 | 蜜桃视频在线观看免费视频网站www | 一区二区三区中文字幕 | 欧美激情在线精品一区二区三区 | 国产精品美女久久久 | 欧美日韩亚洲在线 | 四虎影视| 一区二区精品电影 | 久久久久久久久久久久久9999 | 国产精品欧美精品日韩精品 | 亚洲午夜精品视频 | 日日操日日舔 | 国产一区二区三区视频免费观看 | 久色网| 国内自拍偷拍 | 久久精品| 国产在线播放av |