주석을 캡처하지 않고 소스 코드를 파악하는 방법

주석을 캡처하지 않고 소스 코드를 파악하는 방법

나는 때때로 주석으로 인해 잘못된 긍정을 얻지 않고 소스 코드를 grep하는 방법을 검색했습니다. 예를 들어, 이 .c 소스 코드에서 foo를 검색하면 다음과 같습니다.

/* 
 * foo has changed [...] and is now a 2-parameters function
 */
// foo(24)
foo(42, 28);

순진한 사람들은 grep3번의 발생을 알아차릴 것이지만 나는 1번만 원합니다. 나는 보았다이 방법StackOverflow에서 이 작업을 수행했지만 내 요구 사항에 맞지 않습니다. 해당 플랫폼에서는 PHP를 사용할 수 없습니다. 나도 그걸 알아차렸어이 방법한 줄짜리 설명이지만 내 문제의 일부만 해결합니다.

클래식 스크립팅 도구(awk, sed, bash, grep 등)를 사용해야 하는데 그것이 필요합니다.빠르게수천 개의 파일에도 불구하고.

이제 소스 코드를 grep할 수 있는지, 그리고 소스 코드만 grep할 수 있는지 알고 계십니까?

답변1

grep은 일반 텍스트에서 작동하며 C 프로그램의 기본 구문에 대한 지식이 없습니다. 따라서 내부 리뷰를 검색하지 않으려면 다음과 같은 몇 가지 옵션이 있습니다.

  1. 검색하기 전에 C 주석을 제거하려면 다음 명령을 사용하여 이를 수행할 수 있습니다. gcc -fpreprocessed -dD -E yourfile.c자세한 내용은 참조https://stackoverflow.com/questions/2394017/remove-comments-from-cc-code

  2. 자세한 내용은 가능한 모든 C/C++ 주석을 처리하는 찾은 것과 같은 일부 반작업 스크립트(예: //또는 로 시작하는 줄을 건너뛰어 작동 /*)를 작성/사용하세요(다시 말하지만, 일부 끔찍한 테스트 사례에 대해서는 이전 링크를 참조하세요). 그러면 여전히 오탐지가 발생할 수 있지만 전처리를 수행할 필요는 없습니다.

  3. 고급 도구를 사용하여 코드에서 "의미 검색"을 수행하세요. "coccigrep"을 찾았습니다.http://home.regit.org/software/coccigrep/이러한 도구를 사용하면 특정 언어 명령문(예: 특정 이름을 가진 구조 업데이트)을 검색할 수 있으며 물론 주석도 제거됩니다.

답변2

다음과 같이 주석이 아닌 항목을 일치시키는 간단한 접근 방식을 시도해 볼 수 있습니다.

 $ egrep -v "^(//|/\*| \*)" sourcecode

이는 접두사 주석을 반대로만 일치시킵니다. 즉 //, /*, 또는 로 *시작하는 줄만 일치하므로 및 쌍으로 주석 처리된 블록은 */놓치지 않습니다 ./**/

답변3

나중에 이 질문에 대답하는 사람들을 위해 다음과 같은 구체적인 변형이 있습니다.

ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s

C 소스 파일 목록

ls -1 src/*.c

서브셸에서 전처리기를 실행하는 xargs로 파이프됨

gcc -fpreprocessed -dD -E {} 2>&1

그런 다음 필수 grep 명령으로 파이프됩니다.

grep -wi -e one -e two -e three -n

그런 다음 각 줄 앞에 현재 파일 이름을 붙여서 sed로 파이프합니다.

sed 's:^:{}\::'

마지막으로 cat을 사용하여 반복되는 모든 빈 줄을 한 줄로 축소합니다.

cat -s

이는 RHEL6 시스템에서 작동하지만 다른 *nix 시스템에서는 충분히 일반적이라고 생각합니다.

관련 정보