0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Cコード解析】switchにdefaultを追加する

Posted at

引き続き静的解析ツールの指摘を自動で対処するスクリプトを考える。
今回はswitchにdefaultケースがなければ追加するスクリプトを作成する。

switchブロックを抜き出す

下記の正規表現でマッチできる。以前にブロック単位でパターンマッチングさせる方法を記載したため、そちらをベースに正規表現を考える。

(?<=\n)\s*switch\s*\([^()]*\)\s*(\{(?:[^{}]|(?1))*\})

switchブロック内にdefaultケースがあるか判定する。

下記が完成形のスクリプト。

import regex

def repl_add_default(match):
	matchstr = match.group()

	# 既にdefaultがある場合は、そのままの文字をreturn
	if not regex.search("\s*default\s*:", matchstr, regex.DOTALL):
		index = matchstr.rfind("}")

		indent = regex.search(r"[\t ]*(?=\bswitch\b)", matchstr, regex.DOTALL).group()
		matchstr = matchstr[:index] + "default: /* 処理なし */ break;\n"+ indent + matchstr[index:]

	return matchstr

with open("test.c", "r", encoding="utf-8") as file_obj:
	codetext = file_obj.read()

	ret = regex.sub(r"(?<=\n)\s*switch\s*\([^()]*\)\s*(\{(?:[^{}]|(?1))*\})", repl_add_default, codetext, flags=regex.DOTALL)
	print(ret)

regex.subでマッチしたswitchブロックからdefaultケースがあるかrepl_add_default関数でチェックする。defaultケースがあれば、マッチした文字列をそのまま置換対象とする。(つまり置換前後で変化なし)
defaultケースがない場合は、switchブロックの末尾の}の直前にdefaultケースを追加した文字列を置換対象とする。

まとめ

switchdefaultケースがなくて指摘されるのは、わりといろんな職場で起きてる気がする。このレベルの指摘でも量が多ければ、作業工数が増えるためどんどん自動化したい。ちょっと考えて、以後自動化できるのであれば作業を一度止めてでも自動化した方がいいと思う。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?