在DDR中测试比特翻转代码不再使用GCC-4.7.0

在DDR中测试比特翻转代码不再使用GCC-4.7.0,c,gcc,bootloader,C,Gcc,Bootloader,有一个用于测试DDR的代码,它在GCC-4.2.4中运行良好,但在我们转到GCC-4.7.0后,在执行以下代码后观察到位翻转;这是由于代码中的错误,还是我需要为新的编译器处理一些事情;下面是代码片段: int test_bitflip_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count) { unsigned long volatile *p1 = bufa; unsigned l

有一个用于测试DDR的代码,它在GCC-4.2.4中运行良好,但在我们转到GCC-4.7.0后,在执行以下代码后观察到位翻转;这是由于代码中的错误,还是我需要为新的编译器处理一些事情;下面是代码片段:

int test_bitflip_comparison(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count) {
unsigned long volatile *p1 = bufa;
unsigned long volatile *p2 = bufb;
unsigned int j, k;
unsigned long q;
size_t i;
char *msgBuf;

for (k = 0; k < UL_LEN; k++) {
    q = ONE << k;
    for (j = 0; j < 8; j++) {
         q = ~q;
        p1 = (unsigned long volatile *) bufa;
        p2 = (unsigned long volatile *) bufb;
        for (i = 0; i < count; i++) {
            *p1++ = *p2++ = (i % 2) == 0 ? q : ~q;
        }
        if (compare_regions(bufa, bufb, count)) {
    return -1;
        }
    }
if(!(k % 10))
    puts1(".\0");
}
return 0;
}


}

这是实际代码吗?”因为你的支撑是为你的else情况而准备的,r=-1如何定义一个,如何定义一个0x00000001L;定义UL_LEN 32;这是我原始代码中的一个片段当long是32位类型时,您会遇到未定义的行为。定义一个1ul以避免出现这种情况。并定义UL_LEN CHAR_BIT*sizeof unsigned long,以获得正确的界限,即使大小发生变化。[如果unsigned long有填充位,那也会调用UB,但我还没有听说过在unsigned long中有填充位的实际实现。]谢谢你的回答。你能给我一些关于多长时间会导致未定义行为的见解吗?
int compare_regions(unsigned long volatile *bufa, unsigned long volatile *bufb, size_t count) {
int r = 0;
size_t i;
unsigned long physaddr;
unsigned long volatile *p1 = bufa;
unsigned long volatile *p2 = bufb;

for (i = 0; i < count; i++, p1++, p2++) {
    if (*p1 != *p2) {
        if (use_phys) {
            physaddr = physaddrbase + (i * sizeof(unsigned long));
        } else {
        }
          r = -1;
    }
}
return r;