关于变量定义的古怪bug
2018-02-23 22:14
183 查看
今天调试了一份以前写的code,用的C。
问题相当之古怪,最后的结果也令人惊讶。
简单来说,两个部分,一个文件解析,一个具体动作。文件解析把结果打包交给动作部分执行。从功能上讲,文件解析出来的内容对于动作模块是黑盒,也就是无论解析出来的内容是什么,对还是错,对于动作模块是没有影响的。校验适量一个部分做的。
但是这里出现了问题,当解析部分添加了一个option内容后,在某些情况下动作模块无法运行了。
在排除了内存溢出,数组越界等等可能的问题后,我们真的觉得见鬼了。
最后用最笨的办法,一行行的注释,最后定位到一个奇怪的地方。
就是最标准的for循环,但是不是循环体出错,而就是
for(i = 0;i<tt;i++)这行打开就会出错,注释掉就对了。
改正很简单,但是为什么错了,真是难以理解。
折腾了半天,终于发现,这个i在某些情况下会被改掉(难以理解的诡异情况,这个i在函数体里定义,函数其他地方没有用),而把i的定义不放在函数体的头部,而是写成for( int i = 0;i<tt;i++){}就对了。
这真是百思不得其解,虽然想深究下去,但是问题已经解决了,代码也不是我在维护了,很难重现这个现象了。只好做个Mark,以防以后掉到坑里都不知道怎么爬出来。
问题相当之古怪,最后的结果也令人惊讶。
简单来说,两个部分,一个文件解析,一个具体动作。文件解析把结果打包交给动作部分执行。从功能上讲,文件解析出来的内容对于动作模块是黑盒,也就是无论解析出来的内容是什么,对还是错,对于动作模块是没有影响的。校验适量一个部分做的。
但是这里出现了问题,当解析部分添加了一个option内容后,在某些情况下动作模块无法运行了。
在排除了内存溢出,数组越界等等可能的问题后,我们真的觉得见鬼了。
最后用最笨的办法,一行行的注释,最后定位到一个奇怪的地方。
就是最标准的for循环,但是不是循环体出错,而就是
for(i = 0;i<tt;i++)这行打开就会出错,注释掉就对了。
改正很简单,但是为什么错了,真是难以理解。
折腾了半天,终于发现,这个i在某些情况下会被改掉(难以理解的诡异情况,这个i在函数体里定义,函数其他地方没有用),而把i的定义不放在函数体的头部,而是写成for( int i = 0;i<tt;i++){}就对了。
这真是百思不得其解,虽然想深究下去,但是问题已经解决了,代码也不是我在维护了,很难重现这个现象了。只好做个Mark,以防以后掉到坑里都不知道怎么爬出来。
相关文章推荐
- 关于C++变量的声明和定义
- 关于变量定义时初始化的必要性
- 关于Python函数定义全局变量执行弹出SyntaxWarning的问题
- 关于软件测试中BUG的定义
- 关于软件测试中BUG的定义
- 关于变量的声明和定义,今天算是又长知识
- 关于为什么不能在头文件中包含变量定义的解释
- c++中switch case 中关于变量定义问题
- 关于For循环中定义的变量在循环外的引用
- 关于vc变量定义顺序猜测
- 【看书】关于for循环中定义变量的后续讨论
- Adobe Edge Animate--关于全局变量和全局方法的定义
- 关于换行符已经预定义变量PHP_EOL
- c/c++ 关于变量重复定义 inet_addr it->s_str() == (*it).c_str()
- 关于在Page_Load定义外部变量输出
- C语言中的强符号与弱符号(关于变量声明与定义的深入讨论)
- GCC 和标准C :关于 C语言变量定义
- 关于 .xcconfig文件中 变量的定义的坑:
- javascript中关于变量定义及范围
- 关于VS2008出现对已定义变量报未定义的错误札记