July 21

I'm trying to debug a problem, but saw these Valgrind warnings (from std.array and std.csv):

==1676==
==1676== Warning: invalid file descriptor -1 in syscall close()
==1676== Warning: invalid file descriptor -1 in syscall close()
==1676== Conditional jump or move depends on uninitialised value(s)
==1676== at 0x11149E3: core.internal.gc.impl.conservative.gc.Gcx.sweep() (in ./lt)
==1676== by 0x11162BE: core.internal.gc.impl.conservative.gc.Gcx.fullcollect(bool, bool, bool) (in ./lt)
==1676== by 0x1114058: core.internal.gc.impl.conservative.gc.Gcx.smallAlloc(ulong, ref ulong, uint, const(TypeInfo)) (in ./lt)
==1676== by 0x111A024: core.internal.gc.impl.conservative.gc.ConservativeGC.runLocked!(core.internal.gc.impl.conservative.gc.ConservativeGC.mallocNoSync(ulong, uint, ref ulong, const(TypeInfo)), core.internal.gc.impl.conservative.gc.mallocTime, core.internal.gc.impl.conservative.gc.numMallocs, ulong, uint, ulong, const(TypeInfo)).runLocked(ref ulong, ref uint, ref ulong, ref const(TypeInfo)) (in ./lt)
==1676== by 0x1111ABD: core.internal.gc.impl.conservative.gc.ConservativeGC.qalloc(ulong, uint, scope const(TypeInfo)) (in ./lt)
==1676== by 0x10891B6: gc_qalloc (in ./lt)
==1676== by 0x108C195: _aaGetX (in ./lt)
==1676== by 0x108BDA0: _aaGetY (in ./lt)
==1676== by 0xC30E5D: std.csv.CsvReader!(immutable(char)[][immutable(char)[]], 1, std.algorithm.iteration.joiner!(std.algorithm.iteration.FilterResult!(common._readDailyBarsFromCSV(immutable(char)[], ref long).__lambda9, std.stdio.File.ByLineImpl!(char, char).ByLineImpl).FilterResult, immutable(char)[]).joiner(std.algorithm.iteration.FilterResult!(common._readDailyBarsFromCSV(immutable(char)[], ref long).__lambda9, std.stdio.File.ByLineImpl!(char, char).ByLineImpl).FilterResult, immutable(char)[]).Result, dchar, immutable(char)[][]).CsvReader.prime() (csv.d:1182)
==1676== by 0xC30CFA: std.csv.CsvReader!(immutable(char)[][immutable(char)[]], 1, std.algorithm.iteration.joiner!(std.algorithm.iteration.FilterResult!(common._readDailyBarsFromCSV(immutable(char)[], ref long).__lambda9, std.stdio.File.ByLineImpl!(char, char).ByLineImpl).FilterResult, immutable(char)[]).joiner(std.algorithm.iteration.FilterResult!(common._readDailyBarsFromCSV(immutable(char)[], ref long).__lambda9, std.stdio.File.ByLineImpl!(char, char).ByLineImpl).FilterResult, immutable(char)[]).Result, dchar, immutable(char)[][]).CsvReader.popFront() (csv.d:1154)
...

==1676==
==1676== Warning: invalid file descriptor -1 in syscall close()
==1676== Use of uninitialised value of size 8
==1676== at 0x111BB96: core.internal.gc.impl.conservative.gc.Gcx.mark!(false, true, true).mark(core.internal.gc.impl.conservative.gc.Gcx.ScanRange!(false).ScanRange) (in ./lt)
==1676== by 0x1116AB5: core.internal.gc.impl.conservative.gc.Gcx.markParallel(bool) (in ./lt)
==1676== by 0x1115FCF: core.internal.gc.impl.conservative.gc.Gcx.fullcollect(bool, bool, bool) (in ./lt)
==1676== by 0x1114058: core.internal.gc.impl.conservative.gc.Gcx.smallAlloc(ulong, ref ulong, uint, const(TypeInfo)) (in ./lt)
==1676== by 0x111A024: core.internal.gc.impl.conservative.gc.ConservativeGC.runLocked!(core.internal.gc.impl.conservative.gc.ConservativeGC.mallocNoSync(ulong, uint, ref ulong, const(TypeInfo)), core.internal.gc.impl.conservative.gc.mallocTime, core.internal.gc.impl.conservative.gc.numMallocs, ulong, uint, ulong, const(TypeInfo)).runLocked(ref ulong, ref uint, ref ulong, ref const(TypeInfo)) (in ./lt)
==1676== by 0x1111ABD: core.internal.gc.impl.conservative.gc.ConservativeGC.qalloc(ulong, uint, scope const(TypeInfo)) (in ./lt)
==1676== by 0x10891B6: gc_qalloc (in ./lt)
==1676== by 0xD26B9B: std.array.Appender!(immutable(char)[]).Appender.ensureAddable(ulong)._lambda9() (array.d:3576)
==1676== by 0xD26AB1: std.array.Appender!(immutable(char)[]).Appender.ensureAddable(ulong) (array.d:3576)
==1676== by 0x954102: std.array.Appender!(immutable(char)[]).Appender.put!(char[]).put(char[]).bigDataFun(ulong) (array.d:3679)
==1676== by 0x953FF8: std.array.Appender!(immutable(char)[]).Appender.put!(char[]).put(char[]) (array.d:3682)
==1676== by 0x953FB5: std.array.Appender!(immutable(char)[]).Appender.put!(dchar).put(dchar) (wchar
.d:38)
==1676==
==1676== Conditional jump or move depends on uninitialised value(s)
==1676== at 0x111BBA3: core.internal.gc.impl.conservative.gc.Gcx.mark!(false, true, true).mark(core.internal.gc.impl.conservative.gc.Gcx.ScanRange!(false).ScanRange) (in ./lt)
==1676== by 0x1116AB5: core.internal.gc.impl.conservative.gc.Gcx.markParallel(bool) (in ./lt)
==1676== by 0x1115FCF: core.internal.gc.impl.conservative.gc.Gcx.fullcollect(bool, bool, bool) (in ./lt)
==1676== by 0x1114058: core.internal.gc.impl.conservative.gc.Gcx.smallAlloc(ulong, ref ulong, uint, const(TypeInfo)) (in ./lt)
==1676== by 0x111A024: core.internal.gc.impl.conservative.gc.ConservativeGC.runLocked!(core.internal.gc.impl.conservative.gc.ConservativeGC.mallocNoSync(ulong, uint, ref ulong, const(TypeInfo)), core.internal.gc.impl.conservative.gc.mallocTime, core.internal.gc.impl.conservative.gc.numMallocs, ulong, uint, ulong, const(TypeInfo)).runLocked(ref ulong, ref uint, ref ulong, ref const(TypeInfo)) (in ./lt)
==1676== by 0x1111ABD: core.internal.gc.impl.conservative.gc.ConservativeGC.qalloc(ulong, uint, scope const(TypeInfo)) (in ./lt)
==1676== by 0x10891B6: gc_qalloc (in ./lt)
==1676== by 0xD26B9B: std.array.Appender!(immutable(char)[]).Appender.ensureAddable(ulong)._lambda9() (array.d:3576)
==1676== by 0xD26AB1: std.array.Appender!(immutable(char)[]).Appender.ensureAddable(ulong) (array.d:3576)
==1676== by 0x954102: std.array.Appender!(immutable(char)[]).Appender.put!(char[]).put(char[]).bigDataFun(ulong) (array.d:3679)
==1676== by 0x953FF8: std.array.Appender!(immutable(char)[]).Appender.put!(char[]).put(char[]) (array.d:3682)
==1676== by 0x953FB5: std.array.Appender!(immutable(char)[]).Appender.put!(dchar).put(dchar) (wchar
.d:38)
==1676==

I'm wondering if these warnings should be fixed, and how?

And in general: should the D std lib be Valgrind warning free?

Thanks.

July 21

On Friday, 21 July 2023 at 16:38:12 UTC, mw wrote:

>

And in general: should the D std lib be Valgrind warning free?

By default no, because D's Garbage Collector does some low-level things that trips up valgrind. With dmd 2.105, there is new valgrind support though.

https://dlang.org/changelog/2.105.0.html#druntime.valgrind

Then you shouldn't get any warnings, other than those from your own code.