Commit c3062ede authored by Benjamin Gray's avatar Benjamin Gray Committed by Michael Ellerman
Browse files

selftests/powerpc/ptrace: Declare test temporary variables as volatile



While the target is volatile, the temporary variables used to access the
target cast away the volatile. This is undefined behaviour, and a
compiler may optimise away/reorder these accesses, breaking the test.

This was observed with GCC 13.1.1, but it can be difficult to reproduce
because of the dependency on compiler behaviour.

Signed-off-by: default avatarBenjamin Gray <bgray@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230725005841.28854-5-bgray@linux.ibm.com
parent fc6732a8
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -64,26 +64,26 @@ static bool dawr_present(struct ppc_debug_info *dbginfo)

static void write_var(int len)
{
	__u8 *pcvar;
	__u16 *psvar;
	__u32 *pivar;
	__u64 *plvar;
	volatile __u8 *pcvar;
	volatile __u16 *psvar;
	volatile __u32 *pivar;
	volatile __u64 *plvar;

	switch (len) {
	case 1:
		pcvar = (__u8 *)&glvar;
		pcvar = (volatile __u8 *)&glvar;
		*pcvar = 0xff;
		break;
	case 2:
		psvar = (__u16 *)&glvar;
		psvar = (volatile __u16 *)&glvar;
		*psvar = 0xffff;
		break;
	case 4:
		pivar = (__u32 *)&glvar;
		pivar = (volatile __u32 *)&glvar;
		*pivar = 0xffffffff;
		break;
	case 8:
		plvar = (__u64 *)&glvar;
		plvar = (volatile __u64 *)&glvar;
		*plvar = 0xffffffffffffffffLL;
		break;
	}
@@ -98,16 +98,16 @@ static void read_var(int len)

	switch (len) {
	case 1:
		cvar = (__u8)glvar;
		cvar = (volatile __u8)glvar;
		break;
	case 2:
		svar = (__u16)glvar;
		svar = (volatile __u16)glvar;
		break;
	case 4:
		ivar = (__u32)glvar;
		ivar = (volatile __u32)glvar;
		break;
	case 8:
		lvar = (__u64)glvar;
		lvar = (volatile __u64)glvar;
		break;
	}
}