sprintf做字符串拼接的问题分析

本文通过分析一个使用sprintf进行字符串拼接的例子,揭示了在特定编译选项下,如`-D_FORTIFY_SOURCE=2`和`-O2`,sprintf会被编译为`__sprintf_chk`函数,导致预期结果出错。文章探讨了`__sprintf_chk`与sprintf的区别,指出在考虑安全性的情况下,应避免使用sprintf,推荐使用strcat或strncat替代。
摘要由CSDN通过智能技术生成

调试之前写的一段代码,其中使用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编译出的汇编代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值