注释掉未使用变量,导致程序运行崩溃问题.

yanjinbin0 2010-06-02 10:56:31
环境:arm-linux
内核:2.4.1

注释掉变量位置:
int main()
{
struct termios setbuf;
unsigned char *pshar;
// char xxxxx; //就是注释掉改变量,导致程序运行崩溃
......
以下代码省略
......
}

关键:char xxxxx; 我发现注释掉该段程序运行就会崩溃,但我随意改变该变量的类型和命名,程序运行正常.

但就是不能注释掉,头痛的问题.

有人遇到过这样的问题吗.应该怎么去查找分析原因..

求解.谢谢!!!!!!!!!
...全文
167 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
piedgogo 2010-06-03
  • 打赏
  • 举报
回复
呵呵,两次fclose其实也是内存越界啦~~~

第一次fclose之后*fp指向就发生变化了,第二次fclose就是对未知地址就行操作了~
leo_dengzx 2010-06-02
  • 打赏
  • 举报
回复
这个问题很常见的。

一般是有数组越界或者指针越界。原来因为有个冗余变量,越界的时候只是影响了该变量;现在该变量没了,下面的区域就倒霉了。
steptodream 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lylianlll 的回复:]

编译的时候加上-Wall 看看有没有问题
[/Quote]
支持一下
如果真没用 编译的时候应该就会有警告
范振勇 2010-06-02
  • 打赏
  • 举报
回复
估计是下面的代码把栈破坏了,建议通过地址跟踪的方式确定是哪一条代码破坏的
如:监视被注释变量的地址,逐条代码执行,如果发现变量/内存内容变化,就可以定位了
louyong0571 2010-06-02
  • 打赏
  • 举报
回复
可能注释方式的问题吧
lylianlll 2010-06-02
  • 打赏
  • 举报
回复
编译的时候加上-Wall 看看有没有问题
ydy4618 2010-06-02
  • 打赏
  • 举报
回复
是不是有什么指针指到那里去了?
程序怎么崩溃的?是提示段错误吗?
lylianlll 2010-06-02
  • 打赏
  • 举报
回复
// 是C++ 的注释方式, 用/* */代替看看,这是C语言的注释方式
yanjinbin0 2010-06-02
  • 打赏
  • 举报
回复
首先谢谢,大家给我思路.
最后我发现了我代码在一个很隐秘的条件下会出现内存越界,所以导致了上述错误.

再次感谢大家。
piedgogo 2010-06-02
  • 打赏
  • 举报
回复
老大结婚回来了哇,这么快。。。

[Quote=引用 9 楼 guosha 的回复:]
跟注释没关系的啦,肯定代码的其它地方指针操作有误,有没有定义一个局部变量,程序运行的时候内存分配状态不一致。恰是因为你定义了这么一个无用的变量,把代码其它地方潜在的内存操作错误给暴露出来了。
[/Quote]
piedgogo 2010-06-02
  • 打赏
  • 举报
回复
像是未定义操作蹦出来的错误~~~比如下面程序fclose两次。

你把里面

#include        <stdlib.h>
#include <stdio.h>

int
main()
{
int pid;
FILE *fp = fopen("1.txt","w");
pid = fork();

if(pid == 0){
printf("pid=%d:the father will close the file %x...\n",pid,*fp);
fclose(fp);
}
sleep(1);
printf("pid=%d:the child will close the file %x\n",pid,*fp);
if(fp!=NULL){
if(fileno(fp)>0){ //把这个判断注释掉可以看到未定义操作效果
fclose(fp);
}
}
}
/*-----------------------------------------------------------------------
未定义行为顾名思义就是标准没有对其作出具体规定的行为。比如“fclose 两次”其行为就是一个未定义行为。

对于未定义行为,标准允许编译器可以任意定义一个具体实现,因此这样的行为其结果不是确定的。比如对于上述未定义行为,其具体实现可以是:fclose函数返回错误码、出现段错误程序终止、或者任何其它可能的实现。

由于未定义行为会使程序出现不确定的运行结果从而达不到程序的预定目的,所以这不是我们所希望出现的。因此,一定不要让未定义行为出现在程序中,这是程序员的一个基本职责。比如,“fclose 两次”这个行为会导致未定义行为,那么在程序中就绝对要避免出现“fclose 两次”这样的错误。

对于程序员来说,导致未定义行为产生的行为(如“fclose 两次”)其实就是标准的禁止事项。如果未定义行为在程序中出现了,说明这个程序违反了标准的规定,是非法程序。
------------------------------------------------------------------------*/
快乐田伯光 2010-06-02
  • 打赏
  • 举报
回复
这种问题一般先用gdb分析一下core文件。
leo_dengzx 2010-06-02
  • 打赏
  • 举报
回复
上面这个信息看起来似乎是在sendmessage的时候崩溃了,只能看出这个问题来。

另外,cmdindex看起来是负的,好像不大对,datalength也不大对了。

你把源码贴出来,请大家帮你检查一下越界。
yanjinbin0 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leo_dengzx 的回复:]
这个问题很常见的。
一般是有数组越界或者指针越界。原来因为有个冗余变量,越界的时候只是影响了该变量;现在该变量没了,下面的区域就倒霉了。
[/Quote]
我也是这样认为的.
我程序崩溃时错误输出如下:
SendMessege:msglength=17 mtype =0x4 command =0x1201 sendcmd =0xpc : [<00014970>] lr : [<00014980>] Not tainted
e4 cmdindex sp : bffff9d4 ip : bfa00000 fp : bffff9f4
=-1073743252r10: 401c0c98 r9 : 0000a414 r8 : 00000001
datlength =r7 : 4000b040 r6 : 00008ddc r5 : bffffed4 r4 : 4001c720
1073855812
r3 : c0000000 r2 : 000005c4 r1 : 00000002 r0 : 00000002
Flags: Nzcv IRQs on FIQs on Mode USER_32 Segment user
Control: C000717F Table: 01594000 DAC: 00000015
Segmentation fault

这样的错误格式描述了什么意思,谁清楚啊.
快乐田伯光 2010-06-02
  • 打赏
  • 举报
回复
跟注释没关系的啦,肯定代码的其它地方指针操作有误,有没有定义一个局部变量,程序运行的时候内存分配状态不一致。恰是因为你定义了这么一个无用的变量,把代码其它地方潜在的内存操作错误给暴露出来了。
ecsape 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leo_dengzx 的回复:]

这个问题很常见的。

一般是有数组越界或者指针越界。原来因为有个冗余变量,越界的时候只是影响了该变量;现在该变量没了,下面的区域就倒霉了。
[/Quote]

同意,楼主仔细检查下你省略的代码吧,特别是和unsigned char *pshar相关的操作。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧