Tag: 堆栈溢出

为什么stackoverflow错误混乱?

这个简单的C程序很少在相同的调用深度终止: #include #include void recursive(unsigned int rec); int main(void) { recursive(1); return 0; } void recursive(unsigned int rec) { printf(“%u\n”, rec); recursive(rec + 1); } 这种混乱行为背后的原因是什么? 我使用fedora(16GiB ram,堆栈大小为8192),并使用cc编译,没有任何选项。 编辑 我知道这个程序会抛出一个stackoverflow 我知道启用一些编译器优化会改变行为,程序将达到整数溢出。 我知道这是未定义的行为,这个问题的目的是理解/获得可能解释我们在那里观察到的实现特定内部行为的概述。 问题更多,因为在Linux上,线程堆栈大小是固定的并由ulimit -s给出,会影响可用的堆栈大小,以便堆栈溢出并不总是出现在相同的调用深度? 编辑2 @BlueMoon总是在他的CentOS上看到相同的输出,而在我的Fedora上,堆栈为8M,我看到不同的输出(最后打印的整数261892或261845,或261826,或……)

-fno-stack-protector有什么用?

我用C编写了一个应用程序,我试图在编译时理解-fno-stack-protector命令的用途是什么。 对于我的特定应用程序,如果我在防止缓冲区溢出方面使用此命令,则没有任何区别。 我在网上看到-fstack-protector和-fno-stack-protector命令分别启用和禁用堆栈粉碎保护器,但如果我自己编译应用程序,如何预先启用保护器? 命令的使用是否可能取决于运行应用程序的系统?

递归main() – 为什么会出现段错误?

为什么以下程序会出现段错误? int main() { main(); } 即使它是一个没有结束的递归,因此根据定义也是无效的,我不明白它为什么是segfaults(gcc 4.4.3和clang 1.5(trunk))。

C中的堆栈溢出漏洞利用

问题实际上是关于C中的堆栈溢出。我有一个我不能为我的生活完成的分配,我已经查看了gdb中的所有内容,我只是无法想象它。 问题如下: int i,n; void confused() { printf(“who called me”); exit(0); } void shell_call(char *c) { printf(” ***Now calling \”%s\” shell command *** \n”,c); system(c); exit(0); } void victim_func() { int a[4]; printf(“[8]:%x\n”, &a[8]); printf(“Enter n: “); scanf(“%d”,&n); printf(“Enter %d HEX Values \n”,n); for(i=0;i<n;i++) scanf("%x",&a[i]); printf("Done reading junk numbers\n"); } int main() { printf("ls=736c — […]

捕获堆栈溢出

在C中捕获堆栈溢出的最佳方法是什么? 进一步来说: AC程序包含脚本语言的解释器。 脚本不受信任,可能包含无限的递归错误。 口译员必须能够抓住这些并顺利地继续下去。 (显然,这可以部分地通过使用软件堆栈来处理,但是如果可以用C语言编写大量的库代码块,性能会大大提高;至少,这需要在脚本创建的递归数据结构上运行C函数。) 捕获堆栈溢出的首选forms将涉及longjmp返回主循环。 (丢弃在主循环下面的堆栈帧中保存的所有数据是完全可以的。) 回退可移植解决方案是使用局部变量的地址来监视当前堆栈深度,并使用每个递归函数来包含对使用此方法的堆栈检查函数的调用。 当然,这会在正常情况下产生一些运行时开销; 它也意味着如果我忘记将堆栈检查调用放在一个地方,解释器将有一个潜在的错误。 有没有更好的方法呢? 具体来说,我不期待更好的便携式解决方案,但如果我有一个针对Linux的系统特定解决方案和另一个针对Windows的解决方案,那就没关系。 我已经看到在Windows上引用了一些称为结构化exception处理的东西,尽管我所看到的引用一直是将它转换为C ++exception处理机制; 可以从C访问它,如果是这样,它对这种情况有用吗? 我了解Linux可以捕获分段故障信号; 是否可以将其可靠地转换为longjmp回到主循环? Java似乎支持在所有平台上捕获堆栈溢出exception; 它是如何实现的?

function参数最大数量

我没有发现C99标准中计数函数参数的任何限制,我想它只受堆栈大小的限制。 但是,我编写了一个简单的测试程序来演示具有大量参数的函数的行为。 当它大约10k时,我在gcc上遇到以下错误(gg版本4.5.3在Cygwin上): /usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xa9): undefined reference to `_WinMain@16′ 我意识到这么大的参数数量不太可能,但我想知道编译器的哪个参数决定了这个限制? 编辑 用于生成C源代码的脚本 #!/bin/sh num=$1 echo “” > out.c echo “#include ” >> out.c echo “int getsum( ” >> out.c i=0 while [ $i -lt $num ] do ((i++)) if [ $i -eq $num ] then echo “int p$i )” >> out.c else echo -ne “int p$i,” […]

运行时错误(堆栈溢出)

我用C语言编写了这段代码: char *options[100000]; int k[100000]; char *param[100000]; int n; int i,j; … scanf(“%d”,&n); for (i=0;i<n;i++) { scanf("%s%d",&options[i],&k[i]); param[i]="On"; } … 就像程序到达这一点一样: scanf(“%s%d”,&options[i],&k[i]); 我得到运行时错误(堆栈溢出)。 这里的输入应该是这样的: word1 number1 word2 number2 等等。 我不知道为什么会这样。 有什么问题?