小编use*_*140的帖子

如何从上下文手动递增指令指针?

首先,我要说的是,我在这里做的事情是大多数人没有正当理由去做.99.99%所有段错误应该导致明确的终止,并且在任何但最简单的情况下快乐地处理它们将导致非常糟糕的行为和损坏的堆栈.如果您来到这里寻求解决段错误,请查看以下链接:https://www.securecoding.cert.org/confluence/display/seccode/SIG35-C.+Do+not+return+from+a+计算+异常+信号+处理器

也就是说,我正在致力于从外部标准实现一个环境,该标准定义了从计算逻辑错误的信号处理程序返回的行为,即跳过一条指令.我明白这很糟糕,但是我无法控制它; 我不能仅仅定义这个定义,因为它是一个嵌入式系统,其中已经编写了其他软件元素,这些元素依赖于定义的行为(它们通常是安全关键的,并且需要能够优雅地退出,即使它们不合适或者糟糕的事情;进一步我没有源代码,所以我不能只修复段错误,实际上需要任何现有的坏段错误/崩溃行为,因为我正在模拟现有系统的行为).

虽然系统本身是在具有固定指令长度的PowerPC上运行,但我们的开发是在并行x86/x64环境中进行的,其中指令不是固定长度的.我知道下面的代码可以工作,尽管x86很糟糕:

#define _GNU_SOURCE
#include <signal.h>
#include <stdio.h>
#include <ucontext.h>
#include <sys/mman.h>

#define CRASHME *((int*)NULL) = 0 
//for x86
#ifdef REG_EIP
#define INCREMENT(x) (x)->uc_mcontext.gregs[REG_EIP]++
//for x64
#elif defined REG_RIP
#define INCREMENT(x) (x)->uc_mcontext.gregs[REG_RIP]++
//for PPC arch
#elif defined PT_NIP
#define INCREMENT(x) (x)->uc_mcontext.uc_regs->gregs[PT_NIP]+=4
#endif

static void handler(int sig, siginfo_t *si, void *vcontext)
{
    ucontext_t *context = (ucontext_t *)vcontext;
    INCREMENT(context);
}

void crashme_function(void)
{
    printf("entered new context, segfaulting!\n");
    CRASHME;
    printf("SEGFAULT handled!\n");
}

int main …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly segmentation-fault

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

为什么在重新分配失败后,先前分配的内存无法访问?

我需要为进程分配所有可用内存,以便实现系统服务的测试.测试(以及其他)需要耗尽所有可用资源,尝试呼叫以及检查特定结果.

为了做到这一点,我写了一个循环,重新分配一块内存,直到,realloc返回null,然后使用最后一个好的分配,然后削减上一个成功数量和最后一个不成功的数量之间的差异,直到不成功的数量为1个字节大于上一个成功数量,保证消耗所有可用内存.

我写的代码如下(调试打印也包括在内)

#include <stdio.h>
#include <malloc.h>
int main(void)
{
    char*       X;
    char*       lastgood = NULL;
    char*       toalloc = NULL;
    unsigned int    top = 1;    
    unsigned int    bottom = 1; 
    unsigned int    middle;     
    do              
    {               
        bottom = top;
        lastgood = toalloc;     
        top = bottom*2;                 
        printf("lastgood = %p\ntoalloc = %p\n", lastgood, toalloc); 
        if (lastgood != NULL)           
            printf("*lastgood = %i\n", *lastgood);      
        toalloc = realloc(toalloc, top);    
        printf("lastgood = %p\ntoalloc = %p\n", lastgood, toalloc); 
        if (toalloc == NULL && lastgood != NULL)        
            printf("*lastgood = …
Run Code Online (Sandbox Code Playgroud)

c c++ realloc segmentation-fault

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

标签 统计

c ×2

segmentation-fault ×2

assembly ×1

c++ ×1

realloc ×1

x86 ×1