由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Linux版 - 谁会c啊,能不能看看这个代码有啥问题?
相关主题
segmentation fault as soon as entering 1 function in the ar (转载)[已解决]请问怎么查看所有正在用机器的用户的IP地址?
谁知道这个问题的答案 (转载)如何只允许某个用户从某几台机器ssh进来?
nxagent segfault.......when doing shadowff3.5 貌似用的内存少了很多
哪个发行不升级换代来着?双网卡的配置问题!!
arch升到3.0的kernel了请教如何用shellscript 判断远程路径是否存在
关于gdb一问问个router设置问题
Let a non-root user turn off computerlinux新手求助
请教 GNU Screen display 的问题如何从LINUX系统中访问WINDOWS,非remote desktop
相关话题的讨论汇总
话题: escarg话题: ch话题: null话题: isnull话题: gdb
进入Linux版参与讨论
1 (共1页)
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 还是不给力。
1 (共1页)
进入Linux版参与讨论
相关主题
如何从LINUX系统中访问WINDOWS,非remote desktoparch升到3.0的kernel了
该不该用 lazy unmount 呢关于gdb一问
how to build corp projects in ur EC2 boxLet a non-root user turn off computer
如何在shell里用telnet上mitbbs?请教 GNU Screen display 的问题
segmentation fault as soon as entering 1 function in the ar (转载)[已解决]请问怎么查看所有正在用机器的用户的IP地址?
谁知道这个问题的答案 (转载)如何只允许某个用户从某几台机器ssh进来?
nxagent segfault.......when doing shadowff3.5 貌似用的内存少了很多
哪个发行不升级换代来着?双网卡的配置问题!!
相关话题的讨论汇总
话题: escarg话题: ch话题: null话题: isnull话题: gdb