Page 1 of 1

ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 8:47 am
by Nash
Code: Select allExpand view

    void ReadTestLump
(void)
    {
        
testData.Clear();

        
int lump = -1;
        while (-
!= (lump Wads.FindLump('TESTLUMP'lump 1)))
        {
            
String data Wads.ReadLump(lump);

            
// split lines
            
Array<Stringlines;
            
data.Split(lines"\n"TOK_KEEPEMPTY);

            
// strip comments
            
for (int i 0lines.Size(); i++)
            {
                if (
lines[i].IndexOf("//") == 0)
                {
                    continue;
                }
                else
                {
                    
testData.Push(lines[i]);
                }
            }
        }

        
//Console.Printf("size: %d", testData.Size());
        
for (int i 0testData.Size(); i++)
        {
            
// delete that weird character that gets added at the end
            
testData[i].Truncate(testData[i].Length() - 1);

            if (
testData[i])
            {
                
Console.Printf("%s\n"testData[i]);
            }
        }
    }
 


Load ReadLump.pk3 and ReadLump Mod.pk3, in that order. If a second TestLump.txt is added into your load order, the data contents from the first lump be listed twice. Why does this happen?

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 10:40 am
by phantombeta
Somewhat user error, actually. Caused by an insane, non-sensical, ill-advised, terrible decision in the ZScript compiler.
Function-local variables are never initialized at all. The VM's registers are, but that only happens once, so any variables defined after anything that isn't a variable definition will contain garbage data. And this extends to dynamic arrays.

TL;DR User error caused by a terrible design decision in the ZScript compiler. Always clear your dynamic arrays.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 1:48 pm
by Graf Zahl
This here is actually a real bug. Arrays get initialized at function init, but obviously require a Clear when being declared within a loop.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 3:35 pm
by Nash
Should this thread be moved to Bugs, then?

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sat Dec 01, 2018 4:23 pm
by Graf Zahl
Sure. But you can also fix it on your side by clearing the array right after the declaration.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Mon Dec 03, 2018 1:30 pm
by Ozymandias81
Could be this issue related to this one? Since I load BoA as resource folder from GZDBuilder under GZDoom, there are gzdoom related pk3s loading before BoA...

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Mon Dec 03, 2018 1:38 pm
by Graf Zahl
Are you using ZScript arrays?

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Mon Dec 03, 2018 1:42 pm
by Ozymandias81
I am not the one who is coding with zscript since I am not familiar with it, but yes we are using it

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Mon Dec 03, 2018 1:49 pm
by Graf Zahl
Then check if you define an array inside a for or while loop. That is the only condition which can trigger this.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sun Sep 01, 2019 11:56 am
by Gustavo6046
Sorry for the bump, but I was wondering, doesn't declaring an array in a loop and clearing it delete "garbage data", that could actually happen to be useful memory elsewhere, and potentially cause side effects somewhere else in the game?

I mean, for there to be garbage data, the data must exist. I don't know if it's malloc-ing data that has been freed prior to allocating it again from ZScript.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sun Oct 20, 2019 5:02 am
by _mental_
I propose to fix it like this.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Sun Oct 20, 2019 5:04 am
by Nash
Heh, I have gotten into the habit of immediately Clear()'ing locally-declared dynamic arrays that I forgot I made this report. :lol: Still, a proper fix would be welcome, of course.

Re: ReadLump data is read twice when lumps accumulate

PostPosted: Tue Oct 22, 2019 1:37 am
by Matt
Gustavo6046 wrote:Sorry for the bump, but I was wondering, doesn't declaring an array in a loop and clearing it delete "garbage data", that could actually happen to be useful memory elsewhere, and potentially cause side effects somewhere else in the game?

I mean, for there to be garbage data, the data must exist. I don't know if it's malloc-ing data that has been freed prior to allocating it again from ZScript.
This could be what's been causing a lot of crashes for me lately...