That's probably a DT issue. DFHack does care if DF strings/etc. aren't initialized, and would crash, so given that things like manipulator aren't crashing, uninitialized data is probably not the issue here.
I looked with gdb and IDA, DT is reading the correct value. If something is wrong it is the offset then. But other fields of the object are there, so the location looks good. There are some kind of "holes" in the objects with values like 0xbaadf00d. I find it weird, because if I understand correctly DF is written in C++, how can you get an uninitialized C++ string? (other than casting a pointer to uninitialized memory)
I saw words that were lacking some variant (plural, adjective, ...), where the variant would be uninitialized instead of empty. Or items with an invalid subtype pointer (are there items without a subtype?).
It has been a few weeks since I looked at these issues, so I may be mixing up a few details, but that is the general idea. I can try to get you a more precise example if you want.
Edit: looking at the first invalid string, it happens while reading the adjective for an instrument. The object (item_subtype) as seen from IDA:
000000002CC58570 dq 1407131D8h ; vtable
000000002CC58570 db 'ENT216 INK1',0,0Dh,'¡¦' ; field_8.data
000000002CC58570 dq 0Bh ; field_8.length
000000002CC58570 dq 0Fh ; field_8.capacity
000000002CC58570 dw 0 ; subtype
000000002CC58570 db 0ADh, 0BAh, 0Dh, 0F0h, 0ADh, 0BAh, 0C0h, 71h, 0C5h, 2Ch, 0, 0, 0, 0
000000002CC58570 db 1, 0, 0, 0, 0Dh, 0F0h, 0ADh, 0BAh, 0FFh, 0FFh, 0FFh, 0FFh, 0D8h, 0
000000002CC58570 db 0, 0, 0C0h, 97h, 0C5h, 2Ch, 0, 0, 0, 0, 68h, 98h, 0C5h, 2Ch, 0, 0, 0
000000002CC58570 db 0, 0A0h, 98h, 0C5h, 2Ch, 0, 0, 0, 0
000000002CC58570 db 'sezuk',0,'¡¦',0Dh,'¡¦',0Dh,'¡¦' ; name.data
000000002CC58570 dq 5 ; name.length
000000002CC58570 dq 0Fh ; name.capacity
000000002CC58570 db 'sezuk',0,'¡¦',0Dh,'¡¦',0Dh,'¡¦' ; name_plural.data
000000002CC58570 dq 5 ; name_plural.length
000000002CC58570 dq 0Fh ; name_plural.capacity
000000002CC58570 db 'Éf+,',0,0,0,0,2,0,0,0,0Dh,'¡¦' ; adjective.data
000000002CC58570 dq 6A4BAAD0079h ; adjective.length
000000002CC58570 dq 300000032h ; adjective.capacity
Most fields look good, but there is uninitialized data in the middle of the object (but DT does not read that) and the name_adjective string is also uninitialized (causing the error message).
Edit2: Nevermind the uninitialized data in the middle, it must be padding.
Edit3:Next is a ItemUniform with a bad item_def pointer
00000000346CEF60 db 30h ; "½½½½½½½½½½½½½½½½"
00000000346CEF60 db 0CFh ; item_type
00000000346CEF60 db 6Bh, 40h, 1, 0, 0, 0, 3Bh, 0, 56h, 0, 0A2h, 0, 0ADh, 0BAh, 48h, 0, 0
00000000346CEF60 db 0, 0, 0, 0, 0, 18h, 97h, 2, 0
00000000346CEF60 dd 0BE1Eh ; id
00000000346CEF60 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00000000346CEF60 db 0
00000000346CEF60 dq offset off_371607E0 ; general_refs.begin
00000000346CEF60 dq offset unk_371607F0 ; general_refs.end
00000000346CEF60 dq offset unk_371607F0 ; general_refs.field_10
00000000346CEF60 db 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0, 0, 0ADh, 0BAh, 0Dh
00000000346CEF60 db 0F0h, 0ADh, 0BAh, 0Dh, 0F0h, 0ADh, 0BAh, 0Dh, 0F0h, 0ADh, 0BAh, 0Dh
00000000346CEF60 db 0F0h, 0ADh, 0BAh, 0Dh, 0F0h, 0ADh, 0BAh, 0, 0, 0, 0, 0, 0, 0, 0
00000000346CEF60 dd 1 ; stack_size
00000000346CEF60 db 0Dh, 0F0h, 0ADh, 0BAh, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00000000346CEF60 db 0, 20h, 8, 16h, 37h, 0, 0, 0, 0, 46h, 27h, 9Eh, 1
00000000346CEF60 dw 0 ; wear
00000000346CEF60 db 0ADh, 0BAh, 18h, 97h, 2, 0, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
00000000346CEF60 db 0FFh, 0Dh, 0F0h, 0ADh, 0BAh
00000000346CEF60 dw 26h ; mat_type
00000000346CEF60 db 0ADh, 0BAh
00000000346CEF60 dd 16Bh ; mat_index
00000000346CEF60 dw 0FFFFh ; maker_race
00000000346CEF60 dw 3 ; quality
00000000346CEF60 db 1, 0, 0, 0, 5Dh, 6Ah, 0, 0, 0FFh, 0FFh, 0FFh, 0FFh, 0, 0, 0, 0, 0, 0
00000000346CEF60 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00000000346CEF60 dq 0ABABABABABABABABh ; item_def
Now, that I try to look at the whole structures, I see that the problematic fields are both at the end. The uninitialized data in the middle is expected because mixing short and 64 bits pointer create a lot of padding.
I guess these fields should be skipped in those cases. I need to know what object type have these fields and those which do not, in order to fix that.