Skip to content

Access violation during compilation - stack recursive call access violation

Summary

I'm working on a big project, and whenever I try to add new code and Compile (CTRL+F9), I get an access violation error.

The trace for the call stack is in the Relevant logs.

I tried to debug the problem, but I discovered a stack problem after a couple of recursive calls.

In the fppu.pas inside this function tppumodule.load_usedunits,

The problem happens when there are a lot of ppu files, and when one of the functions returns, it returns to this condition in this code.

right after the tppumodule(pu.u).loadppu(self);

https://gitlab.com/freepascal.org/fpc/source/-/blob/main/compiler/fppu.pas?ref_type=heads#L1955-1960

  tppumodule(pu.u).loadppu(self);
  { if this unit is compiled we can stop }
  if state in [ms_compiled,ms_processed] then
    exit; 
  { add this unit to the dependencies }
  pu.u.adddependency(self,true);  

When I ran the compiler in x64dbg, I noticed the stack bug. At the end of function tppumodule.loadppu right at the execution of the ret instruction, the code returns in the middle of the load_usedunits function at the condition I mentioned.

So right after this return in the middle of the function

There's this code pu.u.adddependency(self,true), and pu points at a random pointer in the stack (Check the screenshot). That's when the code breaks and an Access Violation happens.

System Information

  • Operating system: Windows
  • Processor architecture: x86-64
  • Compiler version: trunk
  • Device: Computer

Steps to reproduce

You need a big project with a lot of units ^_^

Example Project

N/A

What is the current bug behavior?

I think the recursive calling in the fppu unit misses up the stack somehow.

What is the expected (correct) behavior?

The code should continue from where it should be, not from the middle of the function :D

Relevant logs and/or screenshots

Hint: (11030) Start of reading config file F:\FPCross\fpc\bin\x86_64-win64\fpc.cfg
Hint: (11031) End of reading config file F:\FPCross\fpc\bin\x86_64-win64\fpc.cfg
Free Pascal Compiler version 3.3.1-15013-g634e01d525 [2024/07/11] for x86_64
Copyright (c) 1993-2024 by Florian Klaempfl and others
(1002) Target OS: Win64 for x64
(3104) Compiling IceCreamBot.lpr
Error: (1026) Compilation raised exception internally
Fatal: (1018) Compilation aborted
An unhandled exception occurred at $0000000100041E0B:
EAccessViolation: Access violation
  $0000000100041E0B  ADDDEPENDENCY,  line 1009 of fmodule.pas
  $00000001001DE6DA  LOAD_USEDUNITS,  line 1960 of fppu.pas
  $00000001001DEE88  TRY_LOAD_PPUFILE,  line 2223 of fppu.pas
  $00000001001DF29F  LOADPPU,  line 2366 of fppu.pas
  $00000001001DE896  LOAD_USEDUNITS,  line 2016 of fppu.pas
  $00000001001DEE88  TRY_LOAD_PPUFILE,  line 2223 of fppu.pas
  $00000001001DF29F  LOADPPU,  line 2366 of fppu.pas
  $00000001001DE6BE  LOAD_USEDUNITS,  line 1955 of fppu.pas
  $00000001001DEE88  TRY_LOAD_PPUFILE,  line 2223 of fppu.pas
  $00000001001DF29F  LOADPPU,  line 2366 of fppu.pas
  $00000001001DE896  LOAD_USEDUNITS,  line 2016 of fppu.pas
  $00000001001DEE88  TRY_LOAD_PPUFILE,  line 2223 of fppu.pas
  $00000001001DF29F  LOADPPU,  line 2366 of fppu.pas
  $00000001001DE6BE  LOAD_USEDUNITS,  line 1955 of fppu.pas
  $00000001001DEE88  TRY_LOAD_PPUFILE,  line 2223 of fppu.pas
  $00000001001DF29F  LOADPPU,  line 2366 of fppu.pas
  $00000001001DE896  LOAD_USEDUNITS,  line 2016 of fppu.pas

Error: F:\FPCross\fpc\bin\x86_64-win64\ppcx64.exe returned an error exitcode

image

Possible fixes

I think this part of loading the ppu files needs a rewrite ^_^

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information