标签: stack-corruption

K&R:C - 检测到堆栈粉碎

我的代码是这样的:

int find_test(int argc, char *argv[])
{
    char line[MAX_LINES];
    int c, except = 0, found = 0, number = 0;
    long lineno = 0;
    int i = 0;

    while(--argc > 0 && (*++argv)[0] == '-'){
        while(c = *++argv[0]){
            switch(c){
                case 'x':
                    except = 1;
                    break;
                case 'n':
                    number = 1;
                    break;
                default:
                    printf("find:illegal option %c\n", c);
                    argc = 0;
                    found = -1;
                    break;
            }
        }
    }
    if(argc != 1){
        printf("Usage:find -x -n pattern\n");
    }else{
        while(getline(line, MAX_LENGTH) > 0){
            lineno++;
            if((strstr(line, …
Run Code Online (Sandbox Code Playgroud)

c stack-corruption

3
推荐指数
1
解决办法
759
查看次数

变量周围的堆栈已损坏

我知道这个主题有很多问题,但它们似乎都特定于代码.

我有这个功能 -

Point2 ITCS4120::operator* (const Matrix3x3& m, const Point2& p) {
   Point2 result;
   for(int i=0;i<3;i++) {
       result[i] = (m[i][0]*p[0]) + (m[i][1]*p[1]) + (m[i][2]);
       }
   return result; //error here
   }
Run Code Online (Sandbox Code Playgroud)

它在返回语句中给出了一个错误,说"运行时检查失败#2 - 变量'结果'周围的堆栈已损坏."

我看不出那个功能有什么问题.Matrix3x3的阵列只是 -

float array[3][3];
Run Code Online (Sandbox Code Playgroud)

而Point2的数组是

float array [2];
Run Code Online (Sandbox Code Playgroud)

Matrix3x3和Point2类都有这个代码 -

/** Write access for element in row [i] */
inline Scalar* operator[](int i) {return array[i];}
/** Read access for element in row [i] */
inline const Scalar* operator[](int i)const {return array[i];}
Run Code Online (Sandbox Code Playgroud)

这段代码是给我的,我以前做过一些功课,用点,母体和矢量做算术.我的代码通过了所有测试,所以我假设我的Point2 ITCS4120 :: operator*(const Matrix3x3&m,const Point2&p)代码是正确的.但也许我需要以不同的方式使用[]运算符?

c++ stack stack-corruption

2
推荐指数
1
解决办法
2827
查看次数

Lua:避免pcall和Lua callstack超载

我有一个程序,使用执行非常快节奏的Lua脚本调用lua_pcall.似乎程序调用lua脚本的速度太快,事情会崩溃并导致在最随机的地方发生访问冲突.

我尝试过互斥锁,甚至用try/catch启用SEH异常也无济于事.错误功能到位,我正在检查所有适当的返回代码; 问题是pcall内部的实际访问冲突,而不是安全处理的Lua错误.

很多时候中断发生luaV_execute,但有时它在其他随机的地方.我已经检查过以确保推送到堆栈的所有参数都有效.

有没有办法强制Lua在返回之前完成一个调用,或者某种方式确保调用堆栈不会被破坏?

c++ lua callstack access-violation stack-corruption

2
推荐指数
1
解决办法
520
查看次数

FORTRAN和C的互操作性 - REAL(4)太小了吗?

我们在一些英特尔FORTRAN代码中遇到了一些奇怪的崩溃,我最终将这条线跟踪到:

L_F = EXP(-L_B2*L_BETASQ*L_DS)
Run Code Online (Sandbox Code Playgroud)

-L_B2*L_BETASQ*L_DS项的评估值约为-230.碰巧,EXP(-230)的评估值约为1e-100.在所有其他已知情况下,L_DS要小得多,导致EXP的最小(已知)返回约为1e-50,这不会导致错误.

一旦FORTRAN评估条款EXP(-230),您就得到:

forrtl: severe (157): Program Exception - access violation
Image              PC        Routine            Line      Source
Run Code Online (Sandbox Code Playgroud)

但没有其他信息.

异常157通常与互操作性有关,并且您无法在FORTRAN中调试EXP,因为它无法找到特定的.c文件 - 这可能意味着EXP在C中实现(我觉得这很令人惊讶).

我的假设是FORTRAN在C中实现了EXP,但是接口不能将小于1e-100的浮点数转换为REAL(4)s.正如我之前认为浮点数和REAL(4)s在字节方面相同,我无法支持这个假设 - 我无法找到任何关于它的东西.

在我关闭这个错误之前,任何人都可以确认或否认我的假设 - 或者向我提供另一个假设吗?

最好的祝福,

麦克风

编辑: 我将把这个问题标记为已回答,因为高绩效标记已回答了当前的问题.

不幸的是,我的假设是不正确的 - 我试图将这个问题陷入困境:

L_ARG = L_B2*L_BETASQ*L_DS

IF (L_ARG .GT. 230.0) THEN
    L_F = 0.0
ELSE
    L_F = EXP(-L_ARG)
ENDIF
Run Code Online (Sandbox Code Playgroud)

不幸的是,现在(显然)例外发生在L_ARG .GT中.230.0条款.这或者意味着Release模式下的调试比我想象的要糟糕,或者它是某种"存储的"浮点错误(当将float输入到stringstream时,请参阅"浮点无效操作").

c stack interop fortran stack-corruption

2
推荐指数
1
解决办法
320
查看次数

c ++ CRTP堆栈损坏

当在MSVC 2013,x64 Debug config上运行以下代码时,它会在退出main()函数时显示一个带有此着名错误消息的消息框

"Run-Time Check Failure #2 - Stack around the variable 'tmp' was corrupted.". 
Run Code Online (Sandbox Code Playgroud)

我无法回答的问题是:为什么?

请注意,在Release配置上运行时不会出现任何错误消息.(为什么?)

免责声明:这只是一个示例代码,这意味着我试图在其他类(一个基础和几个派生)上使用相同的设计,使用更多的方法和模板参数,并且使用比基本的int*更复杂的数据类型.

#include <iostream>

template <class T>
class base {
public:
    base() {
        static_cast<T*>(this)->setData();
    }
    ~base() {
        static_cast<T*>(this)->destroyData();
    }

    void print() {
        static_cast<T*>(this)->print_int();
    }
};
Run Code Online (Sandbox Code Playgroud)
class derived : public base<derived> {
public:

    void setData() {
        x = new int();
    }

    void destroyData() {
        delete x;
        x = nullptr;
    }

    void print_int() {
        std::cout << "x = " << *x << std::endl;
    } …
Run Code Online (Sandbox Code Playgroud)

c++ crtp stack-corruption

2
推荐指数
1
解决办法
251
查看次数

使用sscanf堆栈损坏

我有以下代码将2个十六进制数字转换为字节值:

const char* data= "Some hex string";
unsigned char temp=' ';
sscanf(data, "%2hhx", &temp);
Run Code Online (Sandbox Code Playgroud)

运行它时,我得到一个运行时异常,说

变量temp周围的堆栈已损坏

我究竟做错了什么?AFAIK 2hhx应该将两个字节转换为一个......

c++ scanf stack-corruption

1
推荐指数
1
解决办法
737
查看次数

标签 统计

stack-corruption ×6

c++ ×4

c ×2

stack ×2

access-violation ×1

callstack ×1

crtp ×1

fortran ×1

interop ×1

lua ×1

scanf ×1