{"record":{"id":"7785828a73816c49","repo":"java-native-access/jna","slug":"field-alignment-is-zero-for-field-structfield-name-within","errorCode":null,"errorMessage":"Field alignment is zero for field '\" + structField.name + \"' within \" + getClass()","messagePattern":"Field alignment is zero for field '\" \\+ structField\\.name \\+ \"' within \" \\+ getClass\\(\\)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/com/sun/jna/Structure.java","lineNumber":1442,"sourceCode":"                value = initializeField(structField.field, type);\n            }\n\n            try {\n                structField.size = getNativeSize(nativeType, value);\n                fieldAlignment = getNativeAlignment(nativeType, value, firstField);\n            }\n            catch(IllegalArgumentException e) {\n                // Might simply not yet have a type mapper set yet\n                if (!force && typeMapper == null) {\n                    return null;\n                }\n                String msg = \"Invalid Structure field in \" + getClass() + \", field name '\" + structField.name + \"' (\" + structField.type + \"): \" + e.getMessage();\n                throw new IllegalArgumentException(msg, e);\n            }\n\n            // Align fields as appropriate\n            if (fieldAlignment == 0) {\n                throw new Error(\"Field alignment is zero for field '\" + structField.name + \"' within \" + getClass());\n            }\n            info.alignment = Math.max(info.alignment, fieldAlignment);\n            if ((calculatedSize % fieldAlignment) != 0) {\n                calculatedSize += fieldAlignment - (calculatedSize % fieldAlignment);\n            }\n            if (this instanceof Union) {\n                structField.offset = 0;\n                calculatedSize = Math.max(calculatedSize, structField.size);\n            }\n            else {\n                structField.offset = calculatedSize;\n                calculatedSize += structField.size;\n            }\n\n            // Save the field in our list\n            info.fields.put(structField.name, structField);\n        }\n","sourceCodeStart":1424,"sourceCodeEnd":1460,"githubUrl":"https://github.com/java-native-access/jna/blob/d036ad9781adad4b66693e8fa7098e4ac665e0a3/src/com/sun/jna/Structure.java#L1424-L1460","documentation":"During layout, the computed alignment for a field was zero, which is impossible for any valid native type. JNA treats this as an internal invariant violation and throws Error, naming the field and Structure class.","triggerScenarios":"fieldAlignment derived from the field's native size/data ends up 0 — typically a zero-sized or mis-sized field type produced by a custom TypeMapper/NativeMapped returning nativeSize 0, or a corrupted alignment calculation path.","commonSituations":"Custom NativeMapped implementations whose nativeSize() returns 0; buggy custom TypeMappers; extending/overriding JNA internals that feed alignment calculation.","solutions":["Fix the custom NativeMapped.nativeSize() implementation to return a positive value","Correct the TypeMapper so mapped types report a valid positive native size","Audit any JNA subclasses overriding size/alignment calculation","If using stock types, report/reproduce with a minimal structure — this signals a JNA internals bug"],"exampleFix":"// before\npublic int nativeSize() { return 0; }\n// after\npublic int nativeSize() { return 4; }","handlingStrategy":"type-guard","validationCode":"for (Field f : S.class.getFields()) {\n    Class<?> t = f.getType();\n    if (NativeMapped.class.isAssignableFrom(t)) {\n        try {\n            NativeMapped nm = (NativeMapped) t.getDeclaredConstructor().newInstance();\n            if (((Integer) nm.getClass().getMethod(\"nativeSize\").invoke(nm)) <= 0) {\n                throw new IllegalStateException(\"nativeSize must be > 0 for \" + t);\n            }\n        } catch (ReflectiveOperationException e) { throw new IllegalStateException(e); }\n    }\n}","typeGuard":"static boolean hasPositiveNativeSize(Class<?> t) {\n    if (!NativeMapped.class.isAssignableFrom(t)) return true;\n    try {\n        Object inst = t.getDeclaredConstructor().newInstance();\n        Object sz = t.getMethod(\"nativeSize\").invoke(inst);\n        return sz instanceof Integer && (Integer) sz > 0;\n    } catch (ReflectiveOperationException e) { return false; }\n}","tryCatchPattern":"try {\n    s.size();\n} catch (Error e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"alignment is zero\")) {\n        throw new IllegalStateException(\"Fix zero-size mapping: \" + e.getMessage(), e);\n    }\n    throw e;\n}","preventionTips":["Never return 0 from NativeMapped.nativeSize()","Audit custom TypeMappers for zero-sized conversions","Keep alignment logic in stock JNA unless unavoidable","Add nativeSize assertions in mapper unit tests"],"tags":["jna","structure","alignment","invariant"],"backgroundTag":"internal-invariant-violation","analyzedSha":"d036ad9781adad4b66693e8fa7098e4ac665e0a3","analyzedAt":"2026-09-12T06:50:59.239Z","contentChangedAt":"2026-09-12T06:50:59.239Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}