Mes tout premiers pas dans la contribution à la communauté du logiciel libre (projets existants)
2026-08-02T23:18:30+08:00
Ces derniers jours, j’ai contribué bien moins à la communauté du logiciel libre que je n’en ai bénéficié, et mes contributions se sont limitées à de petits projets personnels simples ainsi qu’à des contributions non liées au code (comme quelques traductions, le téléversement de quelques captures d’écran sur Debian Screenshots, et la rédaction de billets pour le Free Software Chinese Site). Au cours de l’année écoulée, j’ai appris le C/C++, Qt, l’assemblage et un peu de Rust, et je pense qu’il est temps de faire quelque chose de significatif pour la communauté du logiciel libre et le mouvement du logiciel libre.
AVERTISSEMENT : ceci n’est pas un guide ! Je rédige ce billet uniquement pour partager ma propre expérience. Veuillez consulter la documentation pertinente et demander conseil à des experts pour en apprendre davantage sur la manière de contribuer à la communauté du logiciel libre.
Pourquoi j’ai choisi KDE
À l’origine, j’avais pensé contribuer à postmarketOS. Cependant, j’avais le sentiment que mes compétences étaient bien en deçà de ce qui était nécessaire, et j’ai décidé de commencer par quelque chose de relativement simple. Comme je suis plus familier avec C++ et Qt, j’ai choisi KDE pour ma première contribution à la communauté.
Ressenti
Ma capacité à lire du code source est médiocre. Vers le début de 2025, j’ai essayé de lire le code source de PDF Arranger, et je me suis senti mal à l’aise et submergé.
Cependant, grâce à l’expérience de l’apprentissage du reverse engineering, qui exige de lire du code assembleur, ma capacité à lire le code source de langages de haut niveau s’est également améliorée. Par conséquent, je pense que je devrais tenter une véritable contribution au logiciel libre afin de mettre mes compétences en pratique dans un environnement réel.
Avant d’ouvrir l’arborescence des sources, j’étais quelque peu nerveux, et j’avais peur d’être submergé par le code source, tout comme je l’avais été en lisant le code source de PDF Arranger. Grâce à l’encouragement de mon ami Integral, j’ai trouvé le courage de franchir ce pas.
Outils
Un des environnements de développement recommandés par KDE est la dernière version de Fedora KDE. Comme j’utilise Qubes OS, il m’est très facile de créer rapidement un HVM autonome et d’y effectuer tout mon travail.
Ensuite, j’ai configuré kde-builder conformément à la documentation officielle destinée aux développeurs KDE.
Travail
J’ai parcouru la liste des bogues hébergée par le Bugzilla officiel de KDE. J’ai remarqué un bogue qui semblait très facile à corriger, mais après avoir récupéré le code source et compilé le binaire, j’ai constaté que le bogue n’était pas reproductible dans mon environnement avec la dernière version d’Ark.
Je suis ensuite retourné à la liste des bogues et j’en ai repéré un autre qui semblait anodin. L’environnement système et la version du logiciel indiqués dans le rapport de bogue étaient les mêmes que les miens (Fedora KDE, 26.04), et le bogue était reproductible dans l’application proposée par le dépôt officiel de Fedora. Après l’avoir confirmé, j’ai récupéré le code source et l’ai compilé.
J’ai lancé GDB sur le binaire ~/kde/build/konsole/bin/konsole. Après avoir collé la chaîne mentionnée dans le rapport de bogue (calt,liga,ss03, ss07,ss09) dans le champ, j’ai remarqué cette sortie dans le terminal :
The tag name must be exactly 4 characters long!
Après plusieurs échanges avec un LLM, j’ai trouvé un moyen de localiser la ligne qui affiche cette alerte dans le code source, à l’aide d’un script Python pour GDB :
python
import gdb
TARGET = b"The tag name must be exactly 4 characters long!"
class FilteredWrite(gdb.Breakpoint):
def stop(self):
fd = int(gdb.parse_and_eval("$rdi"))
if fd not in (1, 2):
return False
buf = int(gdb.parse_and_eval("$rsi"))
count = int(gdb.parse_and_eval("$rdx"))
try:
data = gdb.selected_inferior().read_memory(buf, count).tobytes()
except gdb.MemoryError:
return False
if TARGET in data:
gdb.write("\n=== matched output ===\n")
gdb.write(data.decode("utf-8", "replace") + "\n")
gdb.execute("bt full")
return True
return False
FilteredWrite("write")
Après une session GDB, j’ai confirmé que l’alerte provenait du fichier kfontchooser.cpp dans kwidgetsaddons. J’ai également trouvé la fonction qui déclenche l’alerte :
void KFontChooserPrivate::slotFeaturesChanged(const QString &features)
{
m_selectedFont.clearFeatures();
if (features.isEmpty()) {
return;
}
const QStringList rawFeaturesList = features.split(QLatin1Char(','), Qt::SkipEmptyParts);
for (const QString &feature : rawFeaturesList) {
auto f = QStringView(feature).trimmed();
if (f.isEmpty()) {
continue;
}
QList<QStringView> parts = f.split(QStringLiteral("="), Qt::SkipEmptyParts);
if (parts.length() == 2) {
const auto tag = QFont::Tag::fromString(parts[0]);
bool ok = false;
const int number = parts[1].toInt(&ok);
if (tag.has_value() && ok) {
m_selectedFont.setFeature(tag.value(), number);
}
} else if (f.size() <= 4) {
const auto tag = QFont::Tag::fromString(feature);
if (tag.has_value()) {
m_selectedFont.setFeature(tag.value(), 1);
}
}
}
Q_EMIT q->fontSelected(m_selectedFont);
}
J’ai remarqué que le résultat de la séparation était nettoyé :
auto f = QStringView(feature).trimmed();
mais que la chaîne d’origine, non nettoyée, était toujours utilisée comme tag :
const auto tag = QFont::Tag::fromString(feature);
Cela semble être une erreur commise par le développeur. Pour corriger le problème, il suffit de remplacer la chaîne non nettoyée par la chaîne nettoyée :
const auto tag = QFont::Tag::fromString(f);
Ensuite, il était temps de créer une branche, de valider la modification sur cette branche, puis de soumettre une demande de fusion. Cependant, en raison de ma faible expérience avec Git, j’ai rencontré un problème :
warning: redirecting to https://invent.kde.org/rebellfs/kwidgetsaddons.git/
Enumerating objects: 21973, done.
Counting objects: 100% (21973/21973), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2790/2790), done.
Writing objects: 100% (21973/21973), 41.17 MiB | ... KiB/s, done.
Total 21973 (delta 13428), reused 21374 (delta 12884), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (13428/13428), done.
remote: Audit failure - Commit 046e4bb16e60b66070ee4a00c368ca6924db3a08 - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit 046e4bb16e60b66070ee4a00c368ca6924db3a08 - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit c8c7ab3d0e7ca825bbb01d58de005d4d589b12cc - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit c8c7ab3d0e7ca825bbb01d58de005d4d589b12cc - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit 62e5736a1f4afc2d24ef2c4d643a98bc60e6d6cd - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit 62e5736a1f4afc2d24ef2c4d643a98bc60e6d6cd - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit f317243c63620acec15a46c412502e73b9a04e2a - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Audit failure - Commit f317243c63620acec15a46c412502e73b9a04e2a - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)
remote: Push declined - commits failed audit
remote: Should the audit failures above mention issues regarding your name, please ensure that your Git username has been set to your full name.
remote: Please see https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup for more details on ensuring Git has been fully configured.
remote: In the event that your full name has been set and is shown above as being rejected, please file a Sysadmin ticket at https://go.kde.org/systickets
To https://invent.kde.org/rebellfs/kwidgetsaddons
! [remote rejected] work/rebel1725/fix523757 -> work/rebel1725/fix523757 (pre-receive hook declined)
error: failed to push some refs to 'https://invent.kde.org/rebellfs/kwidgetsaddons'
En fin de compte, j’ai soumis cette modification via le navigateur, puisqu’il ne s’agissait que d’un changement mineur dans un seul fichier.
Conclusion
Aujourd’hui, j’ai réalisé ma toute première contribution à la communauté du logiciel libre et je suis également devenu un tout nouveau contributeur au logiciel libre. À l’avenir, j’espère contribuer toujours davantage, perfectionner mes compétences et apporter une contribution de plus en plus utile à la communauté ainsi qu’au mouvement du logiciel libre.
















































