a9 发帖数: 21638 | 1 int i, j, n, ch, isnull;
int needQuote;
char *escarg = va_arg(ap, char *);
isnull = escarg == 0;
if (isnull)
escarg = (xtype == etSQLESCAPE2 ? "NULL" : "(NULL)");
for (i = n = 0; (ch = escarg[i]) != 0; i++)
{
if (ch == '\'' || (xtype == etSQLESCAPE3 && ch == '\\'))
n++;
}
编译没问题,但运行的时候for (i = n = 0; (ch = escarg[i]) != 0; i++)报
Segmentation fault.
gdb:
Program terminated with signal 11, Segmentation fault.
#0 vxprintf (arg=0x40b77be0, fmt=0x4024ac72 "q'", ap=,
useExtended=, func=)
at src/switch_mprintf.c:686
686 for (i = n = 0; (ch = escarg[i]) != 0; i++) {
(gdb) | a9 发帖数: 21638 | 2 对了,运行、编译环境是dockstar arm
【在 a9 的大作中提到】 : int i, j, n, ch, isnull; : int needQuote; : char *escarg = va_arg(ap, char *); : isnull = escarg == 0; : if (isnull) : escarg = (xtype == etSQLESCAPE2 ? "NULL" : "(NULL)"); : for (i = n = 0; (ch = escarg[i]) != 0; i++) : { : if (ch == '\'' || (xtype == etSQLESCAPE3 && ch == '\\')) : n++;
| s******n 发帖数: 6806 | 3 数组越界,应该是传过来的字符串最后少了\0
【在 a9 的大作中提到】 : int i, j, n, ch, isnull; : int needQuote; : char *escarg = va_arg(ap, char *); : isnull = escarg == 0; : if (isnull) : escarg = (xtype == etSQLESCAPE2 ? "NULL" : "(NULL)"); : for (i = n = 0; (ch = escarg[i]) != 0; i++) : { : if (ch == '\'' || (xtype == etSQLESCAPE3 && ch == '\\')) : n++;
| a9 发帖数: 21638 | 4 谢谢,那我该咋改呢?
如果不改其它地方只改这些代码的话》
【在 s******n 的大作中提到】 : 数组越界,应该是传过来的字符串最后少了\0
| N****w 发帖数: 21578 | 5 既然都 gdb 了,看看堆栈里传进来的指针指向啥内容了
【在 a9 的大作中提到】 : 谢谢,那我该咋改呢? : 如果不改其它地方只改这些代码的话》
| a9 发帖数: 21638 | 6 其实我不会用gdb,只是在gdb上看到了上面的错误,不知道下一步该咋办了,呵呵。
【在 N****w 的大作中提到】 : 既然都 gdb 了,看看堆栈里传进来的指针指向啥内容了
| S*A 发帖数: 7142 | 7 应该就是那个传进来的string 没有 null terminate 吧。
你可以在 segfault forloop 前面 printf 看一下那个 arg,
如果 printf 也 segfault 就是 caller 的问题了。
【在 a9 的大作中提到】 : 其实我不会用gdb,只是在gdb上看到了上面的错误,不知道下一步该咋办了,呵呵。
| s***a 发帖数: 299 | 8 if this is not a interview code, then it is very bad written
escarg is a string, if this string does not end with 'null', this for loop
will access out of boundary for sure.
so if u donot want to use gdb, what u can do is :
print out the value of i before segment fault. then go to va_arg(ap, char *)
see how many characters returned and if the string ended with NULL
【在 a9 的大作中提到】 : int i, j, n, ch, isnull; : int needQuote; : char *escarg = va_arg(ap, char *); : isnull = escarg == 0; : if (isnull) : escarg = (xtype == etSQLESCAPE2 ? "NULL" : "(NULL)"); : for (i = n = 0; (ch = escarg[i]) != 0; i++) : { : if (ch == '\'' || (xtype == etSQLESCAPE3 && ch == '\\')) : n++;
| l*********o 发帖数: 3091 | 9 very very bad unreadable code | S*A 发帖数: 7142 | 10 It is not too bad. How else you are going to write a
printf("%s", ...) function?
For the record, if you call printf("%s",...) with
non NUL terminate string, printf can segfault as well. | r****t 发帖数: 10904 | 11 char * 最后没有 \0 是别的地方先越界了覆盖了吧。 freeswitch 还是不给力。
【在 a9 的大作中提到】 : int i, j, n, ch, isnull; : int needQuote; : char *escarg = va_arg(ap, char *); : isnull = escarg == 0; : if (isnull) : escarg = (xtype == etSQLESCAPE2 ? "NULL" : "(NULL)"); : for (i = n = 0; (ch = escarg[i]) != 0; i++) : { : if (ch == '\'' || (xtype == etSQLESCAPE3 && ch == '\\')) : n++;
| a9 发帖数: 21638 | 12 我后来找到问题了。估计是dockstar的问题。
他有个va_xxx,就是开始的地方,传进去的format是 a='%d' and hostname='%q',结
果这个format后变成了hostname=乱七八糟的东西。奇怪的是freeswitch里好些函数都
是这么用的,只有这一个有问题。我直接把hostname给删掉了,反正我就这一个host,
呵呵。
【在 r****t 的大作中提到】 : char * 最后没有 \0 是别的地方先越界了覆盖了吧。 freeswitch 还是不给力。
|
|