我刚刚注意到,我无法让一个函数返回一个结构。
我在启用线程的am 32/debian坞映像上运行这个程序。
这是给出运行时错误的函数:
struct CEC_call des_CEC_call(char * buffy){
char request = buffy[0]; // fails here
buffy+=4;
char obligation = buffy[1];
buffy+=4;
struct CEC_call ceccall;
pepcall.request = request;
pepcall.obligation = obligation;
return ceccall;
} 但是,如果我将返回类型更改为void,则运行中没有问题:
void des_CEC_call(char * buffy){
char request = buffy[0]; // doesn't fail here
buffy+=4;
char obligation = buffy[1];
buffy+=4;
struct CEC_call ceccall;
pepcall.request = request;
pepcall.obligation = obligation;
}对于任何标准的返回类型,返回都可以很好地工作。
定义了结构的标题包含在带有函数的文件中,尽管即使在同一个文件中定义了结构,它仍然会崩溃。不知道如何继续调试,任何帮助都很感激。
编辑:
更多细节,根据评论中的建议:
我已经在我的mac上重新运行了相同的程序,以及其他一些带有docker的非arm架构,而且它运行时没有任何明显的问题。与比特移位有关的一些方面与预期略有不同,但与分割错误没有运行时错误。我试着用不同的优化级别运行它,但没有结果。
我以前使用过GDB,所以我认为这可能会提供一些洞察力,遗憾的是,我还无法让它在这个容器上工作。
我确保安装GDB并使用-0g重新编译二进制文件。
我和--cap-add=SYS_PTRACE和--security-opt seccomp=unconfined一起跑码头。
每次我得到:
warning: Could not trace the inferior process.
Error:
warning: ptrace: Function not implemented
During startup program exited with code 127.我可以使用GDB与其他非手臂,非32位对接图像,没有任何问题。我认为这足以解决另一个问题,因为我花了很长时间试图让GDB处理这个环境。
我并不确定如何进行其他验证,但我已经打印出了buffy所指向的地址和buffy[0]在前面函数中所持有的值以及有问题的函数。
没有结构返回:
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff与struct返回:
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = 0xff58b9ec
buffer[0] = ff
address of buffy = (nil)
qemu: uncaught target signal 11 (Segmentation fault) - core dumpedStruct CEC_call没有任何其他字段。它可能是某个地方的缓冲区溢出,但没有任何缓冲区--至少没有由我制造的缓冲区。我以前没有使用过QEMU IIRC或valingrad,但是我会更详细地研究它们。我现在不能自然地进行测试,因为我无法访问预定的嵌入式linux。
发布于 2020-02-02 21:30:38
struct CEC_call ceccall;
pepcall.request = request;
pepcall.obligation = obligation;似乎您的变量名称不匹配:ceccall和pepcall,并且返回一个未初始化的变量ceccall。
发布于 2020-02-05 15:42:55
我的问题是,获得struct CEC_call des_CEC_call(char * buffy)函数声明的文件的头没有包含在调用文件中。
如果函数返回标准类型或空值,则调用它可以正常工作,但是使用自定义结构返回传入的数组指针将为空。这种情况一开始让我感到困惑,因为我不认为它会因为缺少声明而编译,而且这个分段错误只发生在arm32体系结构上,我没有在OSX上遇到那样的崩溃。
https://stackoverflow.com/questions/59986709
复制相似问题