相关疑难解决方法(0)

Linux中是否有任何标准的退出状态代码?

如果进程的退出状态为0,则认为该进程已在Linux中正确完成.

我已经看到分段错误经常导致退出状态为11,但我不知道这是否只是我工作的惯例(那些失败的应用程序都是内部的)或标准.

Linux中的进程是否有标准退出代码?

linux error-handling exit-code

300
推荐指数
8
解决办法
28万
查看次数

当函数有警告 [-Wreturn-type] 时,为什么优化会忽略 if 语句?

操作系统:ubuntu2204

编译器:gcc 11.2 x86_64

这是一个简单的代码:


#include <cstdlib>

int func(int val) {
    if (val == 1) {
    } else {
        abort();
    }
}

int main(int argc, char* argv[]) {
    func(argc);
}

Run Code Online (Sandbox Code Playgroud)

当我在没有任何优化的情况下编译它并运行它时,它工作正常。

但是当我用 编译它时g++ tmp.cpp -O3,结果func会忽略输入值,而只调用abort.

当然,我可以通过在 的末尾添加 return 语句来修复它func,但是,为什么呢?

这是objdump -d a.out优化函数的一些输出func


0000000000001060 <_Z4funci>:
    1060:   f3 0f 1e fa             endbr64 
    1064:   50                      push   %rax
    1065:   58                      pop    %rax
    1066:   50                      push   %rax
    1067:   e8 e4 ff ff ff …
Run Code Online (Sandbox Code Playgroud)

c++ optimization assembly compiler-optimization undefined-behavior

4
推荐指数
2
解决办法
228
查看次数

Ret(来自过程)将控制权返回到该过程的开头,而不是 Main

我正在使用 MASM 和 Irvine32 编写基本的 ASM 代码。该代码按字符输入,用户输入他们想要输入的字符数,然后循环运行那么多次。
该程序仅接受字母。如果按下 num 或其他内容,则显示“拒绝”消息。
如果 ECX == 0(用户输入的数字),则返回 Main(调用函数)。
现在我的问题是ret指令将控制权交还给同一过程(称为过程)的开始,而不是返回到主程序(调用者)。

include Irvine32.inc
.data
Input_Prompt BYTE "Enter String:", 0
Max_Length_input BYTE "Enter max length to read:", 0
Rejected_mess BYTE "Rejected !", 0
ret_mess BYTE "returing mess !", 0
USER_STR BYTE ?
.code
main PROC
    mov edx, offset Max_Length_input    ;ask for max length
    call WriteString
    call Readint
    mov ecx, eax
    
    mov esi, offset USER_STR ;passing offset of storage
    call String_Input
main endp

String_Input PROC …
Run Code Online (Sandbox Code Playgroud)

x86 assembly masm irvine32

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

退出程序 x86

我正在学习 x86 汇编。我试图了解“退出程序”如何在 x86 上工作。我们有一个代码:

push ebp
mov ebp,esp
//Some stuff here
mov esp, ebp
pop ebp
ret
Run Code Online (Sandbox Code Playgroud)

当处理器执行指令“ret”时:

EIP 将具有从堆栈中弹出的值,即 0。因此处理器将转到 0 地址并尝试执行不包含程序代码/可执行代码的指令。那么,处理器到底发生了什么?是否有条件检查,例如,if EIP = 0 -> exit program? Or if ESP out of bounds -> exit program?`处理器如何理解这条 RET 指令是程序的结尾?

x86 assembly stack exit

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