Discussion:
Crash de Start_Search
(trop ancien pour répondre)
DrPi
2023-10-16 21:31:31 UTC
Permalink
Bonsoir,

Voici les étapes pour reproduire mon problème (Windows 10 64bits) :

alr init --bin dir_search
cd dir_search

Contenu de ./src/dir_search.adb :

with Ada.Text_IO; use Ada.Text_IO;

with Ada.Directories; use Ada.Directories;

procedure Dir_Search is
ST : Search_Type;
DE : Directory_Entry_Type;
begin
Put_Line ("Test en cours...");
Start_Search (ST, ".", "", (others => True));
while More_Entries (ST) loop
Get_Next_Entry (ST, DE);
Put_Line ("Found : " & Simple_Name (DE));
end loop;
Put_Line ("Done.");
end Dir_Search;

alr run -> OK

Ajout d'un fichier nommé "Test avec entête.txt" dans ./

alr run -> !!! Crash !!!

raised ADA.IO_EXCEPTIONS.USE_ERROR : Unable to get modification time of
the file ".\Test avec entête.txt"
[Z:\ada\alire_projects\dir_search\bin\dir_search.exe]
0x7ff796b8b983 Ada.Calendar.Arithmetic_Operations.Add at a-direct.adb:877
0x7ff796b8ce8d Ada.Calendar.Arithmetic_Operations.Add at a-direct.adb:1454
0x7ff796b8d224 Ada.Calendar.Arithmetic_Operations.Add at a-direct.adb:1264
0x7ff796be05a1 Dir_Search at dir_search.adb:10
0x7ff796be0dec Dir_Search at b__dir_search.adb:303
0x7ff796b8143c __tmainCRTStartup at ???
0x7ff796b81144 mainCRTStartup at ???
[C:\WINDOWS\System32\KERNEL32.DLL]
0x7ffcd5077342
[C:\WINDOWS\SYSTEM32\ntdll.dll]
0x7ffcd5c026af

Bug dans la runtime ?

Nicolas
DrPi
2023-10-16 21:35:07 UTC
Permalink
J'ai oublié de préciser que le problème est déclenché dès qu'un
caractère non ASCII se trouve dans un nom de fichier/dossier.
DrPi
2023-10-17 07:44:37 UTC
Permalink
Post by DrPi
J'ai oublié de préciser que le problème est déclenché dès qu'un
caractère non ASCII se trouve dans un nom de fichier/dossier.
L'encodage des caractères exotiques varie d'un système à l'autre, et
d'une implémentation d'Ada à l'autre. Ca peut être de l'UTF8, des pages
de code Windows...
Ici, vraisemblablement, l'encodage ne correspond pas entre le système
et le programme. Tâche de trouver de la doc...

Ce qui m'étonne, c'est que le crash se produit dans la fonction
Dir_Search, fonction de la runtime.
Apparemment, plus préciément, dans le calcul d'une date
(Ada.Calendar.Arithmetic_Operations.Add).

C'est étrange et je ne vois pas comment remédier à ce problème. Il n'y a
rien à ce sujet ici :
http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-A-16.html
Blady
2023-10-18 19:12:07 UTC
Permalink
Post by DrPi
Post by DrPi
J'ai oublié de préciser que le problème est déclenché dès qu'un
caractère non ASCII se trouve dans un nom de fichier/dossier.
L'encodage des caractères exotiques varie d'un système à l'autre, et
d'une implémentation d'Ada à l'autre. Ca peut être de l'UTF8, des pages
de code Windows...
Ici, vraisemblablement, l'encodage ne correspond pas entre le système
et le programme. Tâche de trouver de la doc...
Ce qui m'étonne, c'est que le crash se produit dans la fonction
Dir_Search, fonction de la runtime.
Apparemment, plus préciément, dans le calcul d'une date
(Ada.Calendar.Arithmetic_Operations.Add).
C'est étrange et je ne vois pas comment remédier à ce problème. Il n'y a
http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-A-16.html
Bonjour Nicolas,

J'ai testé sur macOS ça tourne :

% ./bin/test_20231018_dir_search
Test en cours...
Found : .
Found : ..
Found : Test avec entête.txt


Le code concerné est :

C_Name := Name & ASCII.NUL;
Date := C_Modification_Time (C_Name'Address);

if Date = Invalid_Time then
raise Use_Error with
"Unable to get modification time of the file """ & Name &
'"';
end if;

Je suspecte la fonction C_Modification_Time avec des caractères
accentués ayant un code différent entre Linux / macOS / Windows, ce qui
est souvent le cas pour ces fonctions codées en C :

function C_Modification_Time (N : System.Address) return
Ada.Calendar.Time;
pragma Import (C, C_Modification_Time, "__gnat_file_time");

Il faudrait aller voir dans le code C de __gnat_file_time.
Sinon tu peux toujours poster un rapport d'anomalie sur
https://gcc.gnu.org/bugzilla.

Pascal.
DrPi
2023-10-18 19:47:02 UTC
Permalink
Post by Blady
Post by DrPi
Ce qui m'étonne, c'est que le crash se produit dans la fonction
Dir_Search, fonction de la runtime.
Apparemment, plus préciément, dans le calcul d'une date
(Ada.Calendar.Arithmetic_Operations.Add).
C'est étrange et je ne vois pas comment remédier à ce problème. Il n'y
http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-A-16.html
Bonjour Nicolas,
Bonjour Pascal,
Post by Blady
% ./bin/test_20231018_dir_search
Test en cours...
Found : .
Found : ..
Found : Test avec entête.txt
         C_Name := Name & ASCII.NUL;
         Date := C_Modification_Time (C_Name'Address);
         if Date = Invalid_Time then
            raise Use_Error with
              "Unable to get modification time of the file """ & Name &
'"';
         end if;
Je suspecte la fonction C_Modification_Time avec des caractères
accentués ayant un code différent entre Linux / macOS / Windows, ce qui
   function C_Modification_Time (N : System.Address) return
Ada.Calendar.Time;
   pragma Import (C, C_Modification_Time, "__gnat_file_time");
Il faudrait aller voir dans le code C de __gnat_file_time.
Sinon tu peux toujours poster un rapport d'anomalie sur
https://gcc.gnu.org/bugzilla.
Je n'ai pas encore pris le temps de regarder dans le détail.
Tes informations me seront bien utiles.
Je pense qu'un rapport de bug sera nécessaire. A confirmer.

Merci

Nicolas
Stéphane Rivière
2023-10-19 07:04:08 UTC
Permalink
Post by DrPi
Je n'ai pas encore pris le temps de regarder dans le détail.
Tes informations me seront bien utiles.
Je pense qu'un rapport de bug sera nécessaire. A confirmer.
Le runtime en C est souvent l'objet de dysfonctionnements sournois.
J'avais relevé (en traçant dans le runtime), dans la fonction
d'effacement récursif d'une arborescence de dossier, le joli bug du lien
symbolique cassé (qui reste malgré tout un fichier), pas vu pour
l'effacement mais faisant planter l'effacement du répertoire père pour
cause de fichier existant... Signalé en son temps (2020 ?) mais je ne
sais pas si ça a été corrigé.
--
Stéphane Rivière
Ile d'Oléron - France
Loading...