contrib/platform: some declarations use a different integer width than the C prototype
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 48/100
Piste de recherche
Start with the declarations named in CoreFoundation.java, Advapi32.java, LibCAPI.java, X11.java, Carbon.java, OleAuto.java, and User32.java, then compare each against the C prototypes listed in the issue. Check the existing Colormap, NativeLong, LibCAPI.size_t, and WinDef.WORD mappings as relevant. Done means the affected Java declarations use compatible native types, with overloads where needed to preserve callers; consider the stated compatibility tradeoff for PostMessage.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
A few declarations in contrib/platform pass or return an integer whose width differs from the C prototype. None of them is known to give a wrong result today, but the Java type doesn't say what the C side reads. CFEqual is the one I'd look at first: it is the only Boolean return in CoreFoundation that isn't mapped to byte.
// contrib/platform/src/com/sun/jna/platform/mac/CoreFoundation.java:1053, :973, :1019
boolean CFEqual(CFTypeRef cf1, CFTypeRef cf2);
byte CFBooleanGetValue(CFBooleanRef bool);
byte CFNumberGetValue(CFNumberRef number, CFIndex theType, ByReference valuePtr);
// CoreFoundation/CFBase.h:745, :124 (macOS SDK 26.1)
Boolean CFEqual(CFTypeRef cf1, CFTypeRef cf2);
typedef unsigned char Boolean;
The rest are arguments, plus one return:
| declaration | Java | C |
|---|---|---|
Advapi32.RegQueryValueEx, all 5 overloads (Advapi32.java:965-979) |
int lpReserved |
LPDWORD lpReserved |
LibCAPI.gethostname, sethostname, getdomainname, setdomainname (LibCAPI.java:121-126) |
int len |
size_t __len |
X11.XAllocNamedColor (X11.java:748) |
int colormap |
Colormap (unsigned long) |
X11.XCreateSimpleWindow (X11.java:760-762) |
int border, int background |
unsigned long |
X11.XKeycodeToKeysym, XGetKeyboardMapping, XInsertModifiermapEntry, XDeleteModifiermapEntry (X11.java:2025, :2125, :2169, :2178) |
byte |
KeyCode on Linux; unsigned int under NeedWidePrototypes |
Carbon.InstallEventHandler, GetEventParameter (Carbon.java:60, :70) |
int inNumTypes, int inBufferSize |
ItemCount, ByteCount (unsigned long) |
OleAuto.LoadRegTypeLib (OleAuto.java:883) |
int wVerMajor, int wVerMinor |
WORD |
User32.PostMessage (User32.java:836) |
returns void |
returns BOOL |
What it can cause
Nothing I can show for normal values:
- libffi widens an integer argument to the full register by its declared sign, so a non-negative
intarrives correctly where C reads 64 bits. RegQueryValueEx's reserved argument is always 0, which arrives asNULL.- Version numbers fit in a
WORD. CoreFoundationTest.testCFEqualpasses. JNA reads abooleanreturn as a 32-bit int, andCFEqualdefines only the low 8 bits, so a wrongtruewould depend on what the compiled CoreFoundation leaves in the upper bits. I haven't seen that happen.
There are two edge cases. A negative value arrives as a huge unsigned one. And on an Xlib built with wide prototypes (anything but Linux and the BSDs, e.g. XQuartz), a key code of 128 or more reaches the key-code functions sign-extended. PostMessage returning void only means a caller can't see a failed post.
Fix
Use the C types: Pointer for lpReserved, LibCAPI.size_t for the lengths, the existing Colormap or NativeLong for the X11 values, WinDef.WORD for the versions, and byte for CFEqual. Add overloads wherever you'd rather not break compiled callers. I understand if you'd rather leave some of them as they are, especially PostMessage. Happy to send a PR for whichever you'd like.
How this was found
By a research tool that compares each native declaration against the C declaration of the function it binds. Nothing was built or executed; every file quoted is in this repository at 5.19.1, and unchanged on master.
- Langage dominant
- Java
- Étoiles
- 8.9k
- Forks
- 1.7k
- Merge moyen
- 1 j 13 h
- PR mergées (30 j)
- 1
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de java-native-access/jna
-
MacFileUtils: FSPathMakeRef passes an int where the C function takes its FSRef output pointerPeut-être pris @VelpulaGangavardhan l’a pris il y a 4 jours. Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 79/100
java-native-access/jna#1746 · 1 commentaire ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
java-native-access/jna#1745 ·
-
`Native.typeOptions` never releases library interfaces, leaking classloadersPeut-être pris @curforever l’a pris il y a 17 jours. Ouverte
Difficulté 4/5 1-2 jours Accessibilité débutants 48/100
java-native-access/jna#1742 ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 66/100
java-native-access/jna#1738 ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
java-native-access/jna#1736 ·
Toutes les issues de java-native-access/jna
Issues similaires
-
area:core bug priority:p2
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
aomarai/minecraft-mcp#247 ·
Les mainteneurs répondent en général sous 1 jour
-
help wanted
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
antonyrag/ragleap-core#1062 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
Vakore/ZappierGames#232 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 64/100
constellation-app/constellation#2588 ·