调试之前写的一段代码,其中使用sprintf做字符串拼接:
sprintf(sql, "select * from TEST_TABLE");
......
sprintf(sql, "%s%s", sql, " where (RELY_TYPE='S')");
使用auto tools生成Makfile,编译,运行出错:执行完第二句sprintf后sql=“ where (RELY_TYPE='S')”而非预料中的“select * from TEST_TABLE where (RELY_TYPE='S')”
问题分析:
1》
automake生成的gcc编译命令为:
gcc -DHAVE_CONFIG_H -I. -I. -I../src/include -g -fmessage-length=0 -D_FORTIFY_SOURCE=2 -Wall -g -O2 -MT sprintf_test -MD -MP -MF -c -o sprintf_test sprintf_test.c
将该命令简化为:
gcc -D_FORTIFY_SOURCE=2 -g -O2 -o sprintf_test sprintf_test.c
后问题依旧,但是去掉选项 gcc -D_FORTIFY_SOURCE=2 或 -O 2后编译,运行结果sql=“select * from TEST_TABLE where (RELY_TYPE='S')”
2》
对比分析不同选项情况下gcc编译出的汇编代码: