warning: `cnt' might be used uninitialized in this function <-- 이 메세지가 뭔뜻인가요?
글쓴이: superkkt / 작성시간: 목, 2006/03/16 - 2:11오전
gcc에서 -Wall -O2 옵션을 사용하니까 저런게 나오네요.. -O2 없이 컴파일하면 안나옵니다. cnt라는 변수는 read()에서 리턴되는 값을 저장했다가 로그에 기록할때 사용하는 변수인데요..
초기화가 안된 상태로 변수가 사용된다는 뜻같아서 cnt를 선언할때 0으로 초기화를 시켰봤더니 경고가 안나오네요. 그럼 저렇게 경고 나오는 변수를 모두 초기화 시켜줘야 된다는 건데요..
궁금한게 초기화를 안해주는 변수가 엄청 많은데 그중에서 몇개만 저렇게 경고가 나옵니다. 왜 특정 변수만 경고가 나는건가요?
흠.. 저렇게 경고 나오는 변수들을 전부다 초기화 해주는것도 좀 그렇고.. 그냥 -Wall을 빼고 컴파일하는게 속편할까요?
Forums:
초기화하지 않고 그
초기화하지 않고 그 값을 참조하는 경우에는 경고가 생기지만 굳이 초기화하지 않았더라도 참조하기 직전에 어떤 값을 대입하면 경고가 안생깁니다.
선언시에 초기화하지
선언시에 초기화하지 않아도 구문의 흐름상 모든 경로에서 대입이 먼저 일어나면 경고가 일어나지 않습니다.
예를 들어 for 문안에서 대입을하고 for 문 다음에 사용을하는 경우에 대해서, 사람들은 값의 성격상 대입이 반드시 일어난다고 보지만, 구문의 흐름상 for 문이 실행되지 않을 경우도 있으므로 저런 경고를 줍니다.
---
http://coolengineer.com
음..그러면 그냥
음..그러면 그냥 경고를 무시하는게 좋겠네요.. 그걸 다 명시적으로 초기화 하기도 그렇고.. 답변 감사합니다~
======================
BLOG : http://superkkt.com
혹시 이런 것
혹시 이런 것 아닌가요?
int direct,
왜 그런지 알았습니다. doldori님이 적어주신것과 비슷합니다. 위 코드에서 mode는 if아니면 else 둘중에 하나가 실행되기 때문에 반드시 초기화가 되는게 보장이 되지만 direct는 if 3개가 전부 false일 경우 초기화가 안되므로 경고가 나오는 거였습니다. pynoos님이 이미 설명해 주신건데 이해를 못하고 있다가 이제서야 알았습니다.
흠.. 저 3개 외에는 다른 값이 들어갈 일이 없어서 저렇게 코딩한건데.. 컴파일러가 너무 똑똑해도 탈이군요.. :-) 근데 글쓰기가 어렵네요.. 왜 코드가 정렬이 안되서 보이는건지..
======================
BLOG : http://superkkt.com
컴파일러는 제 몫을
컴파일러는 제 몫을 다했을 뿐이죠.
앞으로도 direction에는 IN, OUT, DELETE 외에는 없을 것이 확실하시겠지만, 읽는 사람으로서도 가독성을 높히려면, if 앞에는 모두 else로 넣어주시고
맨마지막 에는
else
{
/* direction은 IN,OUT,DELETE 외에는 없음 */
abort();
}
이것 하나만 넣어 줘도 절대 실행되지 않을 코드이므로 상관없고, 만약 실행된다면 core가 생겨서 gdb 로 열어볼 수 있으니 더 좋습니다.
디버그 모드에서만 사용하시려면, abort(); 대신 assert(0); 를 넣어도 됩니다.
---
http://coolengineer.com
아~ 이런 방법이
아~ 이런 방법이 있었군요.. 그동안 assert가 뭔가 궁금했었는데.. 좋은거 가르쳐 주셔서 감사합니다~~
======================
BLOG : http://superkkt.com
궁금한 함수는..
grep -n 함수명 /usr/include/* // 다른 것이 될 수도 있겠죠.
그 다음에 VI로 열어서 해당 행 가서 그 설명 읽어 보면 쉽죠 뭐... 해더 파일만 봐도 그렇게 복잡한 함수 아니고는 뭐 하는대 쓰는지 알 수 잇으니...
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!
사람천사
댓글 달기