- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这会在使用 GCC 编译时导致堆栈崩溃。
void MyOpenGLLineClass::set_width (float x)
{
float max = 1;
glGetFloatv (GL_ALIASED_LINE_WIDTH_RANGE, &max);
if (false == (x > 0 && x <= max))
throw std::invalid_argument (__PRETTY_FUNCTION__);
m_width = x;
}
它发生在一个程序中,否则它的行为与预期的一样。如果我注释掉 glGetFloatv
,堆栈粉碎就会消失。
这是机器码:
0x00005555556503be <+0>: push %rbp
0x00005555556503bf <+1>: mov %rsp,%rbp
0x00005555556503c2 <+4>: push %r12
0x00005555556503c4 <+6>: push %rbx
0x00005555556503c5 <+7>: sub $0x20,%rsp
0x00005555556503c9 <+11>: callq *0x2e2bf9(%rip) # 0x555555932fc8
0x00005555556503cf <+17>: mov %rdi,-0x28(%rbp)
0x00005555556503d3 <+21>: movss %xmm0,-0x2c(%rbp)
0x00005555556503d8 <+26>: mov %fs:0x28,%rax
0x00005555556503e1 <+35>: mov %rax,-0x18(%rbp)
0x00005555556503e5 <+39>: xor %eax,%eax
0x00005555556503e7 <+41>: pxor %xmm0,%xmm0
0x00005555556503eb <+45>: movss %xmm0,-0x1c(%rbp)
0x00005555556503f0 <+50>: lea -0x1c(%rbp),%rax
0x00005555556503f4 <+54>: mov %rax,%rsi
0x00005555556503f7 <+57>: mov $0x846e,%edi
0x00005555556503fc <+62>: callq 0x5555556262d0 <glGetFloatv@plt>
0x0000555555650401 <+67>: movss -0x2c(%rbp),%xmm0
0x0000555555650406 <+72>: pxor %xmm1,%xmm1
0x000055555565040a <+76>: comiss %xmm1,%xmm0
0x000055555565040d <+79>: seta %al
0x0000555555650410 <+82>: xor $0x1,%eax
0x0000555555650413 <+85>: test %al,%al
0x0000555555650415 <+87>: jne 0x55555565042a <MyOpenGLLineClass::set_width(float)+108>
0x0000555555650417 <+89>: movss -0x1c(%rbp),%xmm0
0x000055555565041c <+94>: comiss -0x2c(%rbp),%xmm0
0x0000555555650420 <+98>: setae %al
0x0000555555650423 <+101>: xor $0x1,%eax
0x0000555555650426 <+104>: test %al,%al
0x0000555555650428 <+106>: je 0x55555565045f <MyOpenGLLineClass::set_width(float)+161>
0x000055555565042a <+108>: mov $0x10,%edi
0x000055555565042f <+113>: callq 0x555555626130 <__cxa_allocate_exception@plt>
0x0000555555650434 <+118>: mov %rax,%rbx
0x0000555555650437 <+121>: lea 0x8ee42(%rip),%rsi # 0x5555556df280 <_ZZN3CMyOpenGLLineClass9set_widthEfE19__PRETTY_FUNCTION__>
0x000055555565043e <+128>: mov %rbx,%rdi
0x0000555555650441 <+131>: callq 0x555555625f80 <_ZNSt16invalid_argumentC1EPKc@plt>
0x0000555555650446 <+136>: mov 0x2e2b5b(%rip),%rax # 0x555555932fa8
0x000055555565044d <+143>: mov %rax,%rdx
0x0000555555650450 <+146>: lea 0x2de9f1(%rip),%rsi # 0x55555592ee48 <_ZTISt16invalid_argument@@GLIBCXX_3.4>
0x0000555555650457 <+153>: mov %rbx,%rdi
0x000055555565045a <+156>: callq 0x555555625a80 <__cxa_throw@plt>
0x000055555565045f <+161>: mov -0x28(%rbp),%rax
0x0000555555650463 <+165>: movss -0x2c(%rbp),%xmm0
0x0000555555650468 <+170>: movss %xmm0,0x58(%rax)
0x000055555565046d <+175>: nop
0x000055555565046e <+176>: mov -0x18(%rbp),%rax
0x0000555555650472 <+180>: xor %fs:0x28,%rax
0x000055555565047b <+189>: je 0x55555565049a <MyOpenGLLineClass::set_width(float)+220>
0x000055555565047d <+191>: jmp 0x555555650495 <MyOpenGLLineClass::set_width(float)+215>
0x000055555565047f <+193>: mov %rax,%r12
0x0000555555650482 <+196>: mov %rbx,%rdi
0x0000555555650485 <+199>: callq 0x5555556263c0 <__cxa_free_exception@plt>
0x000055555565048a <+204>: mov %r12,%rax
0x000055555565048d <+207>: mov %rax,%rdi
0x0000555555650490 <+210>: callq 0x555555625b00 <_Unwind_Resume@plt>
0x0000555555650495 <+215>: callq 0x5555556258a0 <__stack_chk_fail@plt>
=> 0x000055555565049a <+220>: add $0x20,%rsp
0x000055555565049e <+224>: pop %rbx
0x000055555565049f <+225>: pop %r12
0x00005555556504a1 <+227>: pop %rbp
0x00005555556504a2 <+228>: retq
为什么会发生堆栈崩溃?
最佳答案
根据Khronos reference , glGetFloatv
和 GL_ALIASED_LINE_WIDTH_RANGE
返回两个值:
GL_ALIASED_LINE_WIDTH_RANGE
params returns two values, the smallest and largest supported widths for aliased lines.
所以第二个值调用 UB 并粉碎你的堆栈。
固定:
void MyOpenGLLineClass::set_width (float x)
{
float range[] = {0,0};
glGetFloatv (GL_ALIASED_LINE_WIDTH_RANGE, range);
if (false == (x >= range[0] && x <= range[1]))
throw std::invalid_argument (__PRETTY_FUNCTION__);
m_width = x;
}
关于c++ - glGetFloatv 导致堆栈粉碎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58539690/
Video explaining for those who does not understand 此答案未正确回答,请尝试使用其他解决方案来回答(100 Bounty 已过期) 同样的问题,但解释
我有一个使用线程来从文件中读取一些内容的 Activity 。 问题是,如果用户决定在线程运行时旋转屏幕,应用程序就会崩溃。 我知道我可以使用以下方法阻止屏幕旋转: android:screenOri
我正在上计算机安全课并且正在阅读 http://phrack.org/issues/56/8.html .在 bo3.cpp 中,作者创建了他自己的 VTABLE,并覆盖 VPTR 以指向他的 VTA
我们在 Mesos 0.17 上针对 CDH5 运行 Spark 0.9.1。到目前为止,我们继续使用 CDH 系列的“mr1”版本,以便我们可以运行 filecrush。项目在我们的小文件上。由于各
我知道如何删除文件以使它们无法恢复。但是,如何以导致相同结果的方式从 POSIX 环境中的 MySQL 表中删除行?在继续删除该行之前,我目前正在使用与原始数据长度相同的无效字符串重写所有数据。它有效
我有一个如下所示的 XML 文件:
我正在尝试使用 Tween 和平面几何在 Three.js 中创建玻璃 splinter 效果,但有点迷失。网格/几何体不会随补间更新,如果我在第一次渲染之前调用 shatter(),您可以看到补间正
我正在尝试使用我在 XML 中接收的一些日志数据。 在清理数据以使其成为有效的 XML 之后,我在 SQL Server 中获得了 XML 数据包。 (并从 JSON 包装器等中获取其他属性) 但是现
当我将 slim-rails 添加到 Gemfile 并启动我的应用程序时,它崩溃并出现以下错误: /Users/rado/.rbenv/versions/2.3.1/gemsets/project/
我是一名优秀的程序员,十分优秀!