Edk2 Address Sanitizer debugging - shijunjing/edk2 GitHub Wiki

Build steps:

~/wksp_efi/edk2$ git checkout sanitizer
~/wksp_efi/edk2$ build -p OvmfPkg/OvmfPkgIa32X64.dsc -t CLANGSAN40 -a IA32 -a X64 -b NOOPT -n 5 -DDEBUG_ON_SERIAL_PORT
~/wksp_efi/edk2$ cd Build/rootfs/
~/wksp_efi/edk2$ cp ../Ovmf3264/NOOPT_CLANGSAN40/X64/TestModuleDxe.efi .
~/wksp_efi/edk2/Build/rootfs$ sudo qemu-system-x86_64  -serial file:serial.txt -m 5120 -hda fat:. -monitor stdio --enable-kvm -smp 4 -bios ../Ovmf3264/NOOPT_CLANGSAN40/FV/OVMF.fd -global e1000.romfile="" -machine q35 -cpu SandyBridge,+rdrand
In qemu, boot into shell:
Shell> reconnect -r
Shell> fs0:
FS0:\> load TestModuleDxe.efi
~/wksp_efi/edk2/Build/rootfs$ cd ../..
~/wksp_efi/edk2$ python UbsanLogCheck.py Build/rootfs/serial.txt Build/Ovmf3264/NOOPT_CLANGSAN40/
Done!

Failure Test case:

EFI_STATUS
EFIAPI
TestModuleDxeEntryPoint (
  IN EFI_HANDLE           ImageHandle,
  IN EFI_SYSTEM_TABLE     *SystemTable
  )
{
  char a1[2];
  char a2[3];
  SerialOutput ("CopyMem Test begin \n");
  a1[0] = 'a';
  a1[1] = 'b';
  a2[0] = 'c';
  a2[1] = 'd';
  a2[2] = 'e';
  a1[2] = 'f';
  a2[3] = 'g';
  CopyMem(a1, a2, 3);
  CopyMem(a2, a1, 3);
  SetMem(a1, 10, 0xFF);
  SetMem(a2, 10, 0xFF);  
  return EFI_SUCCESS;
}

Current issue is the CopyMem and SetMem libraries are implemented in assembly code in the BaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf, but the Asan cannot do the instrumentation in the assembly code. So, the CopyMem and SetMem assembly function's buffer overflow access cannot be detected by Asan.