Msg/ClobberedSP: Difference between revisions
From CPUlator Wiki
< Msg
< Msg
No edit summary |
No edit summary |
||
Line 34: | Line 34: | ||
* Fundamentally, this message is complaining that the stack pointer differs between the start of the function and at the function return. Use breakpoints and make a note of the value of the stack pointer at both the function entry and return. Are they the same? | * Fundamentally, this message is complaining that the stack pointer differs between the start of the function and at the function return. Use breakpoints and make a note of the value of the stack pointer at both the function entry and return. Are they the same? | ||
* The most common way to use the stack pointer is to modify it while pushing and popping values on the stack. When pushes and pops are mismatched, there is a net change in the stack pointer in the function. | * The most common way to use the stack pointer is to modify it while pushing and popping values on the stack. When pushes and pops are mismatched, there is a net change in the stack pointer in the function. | ||
=== Implementation === | |||
The simulator identifies idiomatic call and return instructions executed at runtime. It records the values of registers when executing call instructions, and verifies that they haven't changed when executing the matching function return. This warning is generated at the return instruction. | |||
{{DisableMsg|Function clobbered ra or sp}} | {{DisableMsg|Function clobbered ra or sp}} |
Revision as of 00:50, 10 March 2019
A function should always ensure that the stack pointer is the same at the entry and exit of the function. This message tells you that this didn't happen: the stack pointer was different at the function return than when the function was first called.
Examples
ARMv7
.global _start
_start:
mov sp, #0x1000 // Initialize SP to something sane
bl MyFunction
nop
nop
# ...
MyFunction:
push {r4} // Change SP
bx lr // SP is different at return
Nios II
.global _start
_start:
movi sp, 0x1000 # Initialize SP
call Function
nop
nop
Function:
subi sp, sp, 4 # Modify SP
ret # SP is different at return
Debugging
- Fundamentally, this message is complaining that the stack pointer differs between the start of the function and at the function return. Use breakpoints and make a note of the value of the stack pointer at both the function entry and return. Are they the same?
- The most common way to use the stack pointer is to modify it while pushing and popping values on the stack. When pushes and pops are mismatched, there is a net change in the stack pointer in the function.
Implementation
The simulator identifies idiomatic call and return instructions executed at runtime. It records the values of registers when executing call instructions, and verifies that they haven't changed when executing the matching function return. This warning is generated at the return instruction.
Disabling this message
This debugging check can be disabled in the Debugging Checks section of the Settings box: Function clobbered ra or sp.