Reducing undefined behavior in the C language
🇬🇧 English
We're bad at marketing — we admit it. Our strength is writing the kind of articles that developers, administrators, and free-software supporters depend on to know what is going on in the Linux world. Please subscribe today to help us keep doing that, and so we don’t have to get good at marketing.
As a professor of biomedical engineering, Martin Uecker perhaps does not fit the profile of a typical presenter at Kernel Recipes. He is, however, a longtime Linux user, and works on free software for controlling magnetic resonance imaging (MRI) scanners. He was at the conference to talk about the C programming language, the specific problem of undefined behavior in C, and whether it can eventually be made into a memory-safe language.
Why bother with C in 2026? It is, he said, still a great language. C is portable, stable over the long term, offers fast compilation, and the resulting binary code is fast. "What you see is what you get"; it is easy to look at C code and have some idea of what the computer will actually do. There are a lot of tools for working with the language, and C gets out of the way when necessary.
C does have a long history, and that affects the language as we see it today, he said. The C89 standard had to cope with a wide variety of hardware, including machines with signed-magnitude or one's-complement integer representations, segmented memory, exotic pointer representations, and surprising sizes for types. Some Honeywell machines, for example, had nine-bit bytes. That greatly complicated the task of writing a standard that would enable the writing of portable code. The approach that was taken was to define the semantics of the language in terms of an abstract machine. All operations are to be executed as if they had run on that abstract machine, which may not exactly match the actual hardware. The observable behavior of the program must be what the abstract machine would have done.
🇸🇦 العربية
تقليل السلوك غير المحدد في لغة C
نحن سيئون في التسويق — نعترف بذلك. قوتنا تكمن في كتابة نوع المقالات التي يعتمد عليها المطورون ومديرو الأنظمة وداعمو البرمجيات الحرة لمعرفة ما يحدث في عالم لينكس. يرجى الاشتراك اليوم لمساعدتنا على الاستمرار في ذلك، حتى لا نضطر إلى أن نصبح جيدين في التسويق.
بصفتي أستاذاً للهندسة الطبية الحيوية، ربما لا يناسب مارتين أوير صورة المتحدث النموذجي في Kernel Recipes. ومع ذلك، فهو مستخدم لينكس منذ فترة طويلة، ويعمل على برمجيات حرة للتحكم في أجهزة التصوير بالرنين المغناطيسي (MRI). كان في المؤتمر للحديث عن لغة البرمجة C، والمشكلة المحددة للسلوك غير المحدد في C، وما إذا كان يمكن في النهاية جعلها لغة آمنة من حيث الذاكرة.
لماذا العناء بـ C في عام 2026؟ قال إنها لا تزال لغة رائعة. C قابلة للنقل، ومستقرة على المدى الطويل، وتوفر compiling سريعاً، والكود الثنائي الناتج سريع. "ما تراه هو ما تحصل عليه"؛ من السهل النظر إلى كود C والتوصل إلى فكرة عما سيفعله الكمبيوتر فعلياً. هناك الكثير من الأدوات للعمل مع اللغة، وC يتراجع عند الحاجة.
تمتلك C تاريخاً طويلاً، وهذا يؤثر على اللغة كما نراها اليوم، قال. كان معيار C89 يجب أن يتعامل مع مجموعة واسعة من الأجهزة، بما في ذلك آلات بتمثيلات أعداد صحيحة بإشارة-قيمة مطلقة أو بتكملة واحد، وذاكرة مجزأة، وتمثيلات غريبة للمؤشرات، وأحجام مفاجئة للأنواع. بعض آلات Honeywell، على سبيل المثال، كانت تحتوي على بايتات من تسعة بتات. هذا ما أعقد بشكل كبير مهمة كتابة معيار يمكنه تمكين كتابة كود قابل للنقل. النهج الذي تم اتخاذه كان تعريف دلالات اللغة من حيث آلة مجردة. يجب تنفيذ جميع العمليات كما لو كانت قد عملت على تلك الآلة المجردة، والتي قد لا تطابق العتاد الفعلي تماماً. يجب أن يكون السلوك الملحوظ للبرنامج هو ما كانت ستفعله الآلة المجردة.
هل يمكن جعل لغة البرمجة C آمنة من حيث الذاكرة؟
وفقاً لمارتين أوير، بينما تتمتع C بمزايا كبيرة مثل قابلية النقل، والـ compiling السريع، والإخراج الثنائي المتوقع، فإن تصميمها التاريخي وسموح معيار C بالسلوك غير المحدد — بما في ذلك احتمال وجود 'أشباح أنفية' — يجعل تحقيق الأمان من حيث الذاكرة تحدياً دون تغييرات جوهرية في دلالات اللغة.
🇧🇩 বাংলা
C ভাষায় অসংজ্ঞায়িত আচরণ কমানো
আমরা মার্কেটিংয়ে খারাপ — আমরা স্বীকার করি। আমাদের শক্তি হলো সেই ধরনের নিবন্ধ লেখা যা ডেভেলপার, প্রশাসক এবং ফ্রি-সফটওয়্যার সমর্থকরা Linux জগতে কী ঘটছে তা জানার জন্য নির্ভর করে। অনুগ্রহ করে আজই সাবস্ক্রাইব করুন যাতে আমরা এটি চালিয়ে যেতে পারি, এবং তাই আমাদের মার্কেটিংয়ে ভালো হতে হয় না।
একজন বায়োমেডিক্যাল ইঞ্জিনিয়ারিং প্রফেসর হিসেবে, মার্টিন উএকার সম্ভবত Kernel Recipes-এর একটি সাধারণ উপস্থাপনকারীর প্রোফাইলের সাথে মানানসই নন। তবে, তিনি দীর্ঘদিনের Linux ব্যবহারকারী, এবং চৌম্বকীয় রেজোন্যান্স ইমেজিং (MRI) স্ক্যানার নিয়ন্ত্রণের জন্য ফ্রি সফটওয়্যার নিয়ে কাজ করেন। তিনি C প্রোগ্রামিং ভাষা, C-তে অসংজ্ঞায়িত আচরণের নির্দিষ্ট সমস্যা, এবং এটি শেষ পর্যন্ত একটি মেমোরি-সেফ ভাষা হয়ে উঠতে পারে কিনা — এগুলোর উপর কথা বলতে কনফারেন্সে উপস্থিত ছিলেন।
২০২৬ সালে C নিয়ে কেন মাথা ঘামানো? তিনি বলেছিলেন, এটি এখনও একটি মহান ভাষা। C পোর্টেবল, দীর্ঘমেয়াদে স্থিতিশীল, দ্রুত কম্পাইলেশন প্রদান করে, এবং ফলাফলস্বরূপ বাইনারি কোড দ্রুত। "আপনি যা দেখেন তাই পান"; C কোড দেখা সহজ এবং কম্পিউটার আসলে কী করবে তার একটি ধারণা পাওয়া যায়। ভাষার সাথে কাজ করার জন্য অনেক টুলস আছে, এবং প্রয়োজন হলে C পিছনে সরে যায়।
C-এর একটি দীর্ঘ ইতিহাস আছে, এবং এটি আজ আমরা যে ভাষাটি দেখি তাতে প্রভাব ফেলে, তিনি বলেছিলেন। C89 স্ট্যান্ডার্ডকে হার্ডওয়্যারের একটি বিস্তৃত বৈচিত্র্যের সাথে মোকাবিলা করতে হয়েছিল, যার মধ্যে সাইন-ম্যাগনিটিউড বা ওয়ান-কমপ্লিমেন্ট পূর্ণসংখ্যা উপস্থাপনা, বিভাজিত মেমোরি, অদ্ভুত পয়েন্টার উপস্থাপনা, এবং টাইপগুলোর অবাক করা আকার অন্তর্ভুক্ত ছিল। কিছু Honeywell মেশিন, উদাহরণস্বরূপ, নয়-বিট বাইট ছিল। এটি পোর্টেবল কোড লেখাকে সক্ষম করা একটি স্ট্যান্ডার্ড লেখার কাজকে প্রচুর জটিল করে তুলেছিল। নেওয়া পদ্ধতিটি ছিল ভাষার অর্থশাস্ত্রকে একটি অমূর্ত যন্ত্রের পরিপ্রেক্ষিতে সংজ্ঞায়িত করা। সকল অপারেশন এমনভাবে সম্পন্ন হতে হবে যেন সেগুলো সেই অমূর্ত যন্ত্রে চালানো হয়েছিল, যা প্রকৃত হার্ডওয়্যারের সাথে ঠিক মিল নাও হতে পারে। প্রোগ্রামের পর্যবেক্ষণযোগ্য আচরণ এমন হতে হবে যা অমূর্ত যন্ত্রটি করেছিল।
C প্রোগ্রামিং ভাষা কি মেমোরি-সেফ করা যেতে পারে?
মার্টিন উএকারের মতে, যদিও C-তে পোর্টেবিলিটি, দ্রুত কম্পাইলেশন এবং পূর্বাভাসযোগ্য বাইনারি আউটপুটের মতো উল্লেখযোগ্য সুবিধা রয়েছে, এর ঐতিহাসিক নকশা এবং C স্ট্যান্ডার্ডের অসংজ্ঞায়িত আচরণ — যার মধ্যে 'নাসাল ডিমন্স'-এর সম্ভাবনাও অন্তর্ভুক্ত — অনুমোদন, ভাষার অর্থশাস্ত্রে ব্যাপক পরিবর্তন ছাড়া মেমোরি নিরাপত্তা অর্জনকে চ্যালেঞ্জিং করে তোলে।
🇩🇪 Deutsch
Undefiniertes Verhalten in der C-Sprache reduzieren
Wir sind schlecht im Marketing — das geben wir zu. Unsere Stärke liegt darin, Artikel dieser Art zu schreiben, auf die Entwickler, Administratoren und Befürworter freier Software angewiesen sind, um zu wissen, was in der Linux-Welt vor sich geht. Abonnieren Sie noch heute, um uns dabei zu helfen, weiterhin so zu tun, damit wir nicht gut im Marketing werden müssen.
Als Professor für biomedizinische Technik passt Martin Uecker vielleicht nicht in das Profil eines typischen Vortragenden auf Kernel Recipes. Er ist jedoch ein langjähriger Linux-Nutzer und arbeitet an freier Software zur Steuerung von Magnetresonanztomographie-(MRT)-Scannern. Er war auf der Konferenz, um über die C-Programmiersprache, das spezifische Problem des undefinierten Verhaltens in C und die Frage zu sprechen, ob sie letztendlich zu einer speichersicheren Sprache gemacht werden kann.
Warum sich 2026 noch mit C beschäftigen? Es sei immer noch eine großartige Sprache, sagte er. C ist portabel, langfristig stabil, bietet schnelle Kompilierung, und der resultierende Binärcode ist schnell. "Was Sie sehen, ist was Sie bekommen"; es ist einfach, C-Code anzusehen und eine Vorstellung davon zu haben, was der Computer tatsächlich tun wird. Es gibt viele Werkzeuge für die Arbeit mit der Sprache, und C tritt zurück, wenn es notwendig ist.
C hat eine lange Geschichte, und das beeinflusst die Sprache, wie wir sie heute sehen, sagte er. Der C89-Standard musste sich mit einer breiten Vielfalt an Hardware auseinandersetzen, einschließlich Maschinen mit Vorzeichen-Betrag- oder Eins-Komplement-Ganzzahldarstellungen, segmentiertem Speicher, exotischen Pointer-Darstellungen und überraschenden Größen für Typen. Einige Honeywell-Maschinen hatten beispielsweise Neun-Bit-Bytes. Das erschwerte die Aufgabe, einen Standard zu schreiben, der das Schreiben portablen Codes ermöglichte, erheblich. Der eingeschlagene Ansatz bestand darin, die Semantik der Sprache in Bezug auf eine abstrakte Maschine zu definieren. Alle Operationen sind so auszuführen, als wären sie auf dieser abstrakten Maschine ausgeführt worden, die nicht genau der tatsächlichen Hardware entsprechen mag. Das beobachtbare Verhalten des Programms muss das sein, was die abstrakte Maschine getan hätte.
Kann die C-Programmiersprache speichersicher gemacht werden?
Laut Martin Uecker sind zwar C erhebliche Vorteile wie Portabilität, schnelle Kompilierung und vorhersagbare Binärausgabe eigen, doch machen sein historisches Design und die vom C-Standard zugelassene Möglichkeit undefinierten Verhaltens — einschließlich der Möglichkeit von "nasalen Dämonen" — die Erreichung von Speichersicherheit ohne wesentliche Änderungen an der Sprachsemantik herausfordernd.
🇪🇸 Español
Reducir el comportamiento indefinido en el lenguaje C
Somos malos en marketing — lo admitimos. Nuestra fortaleza es escribir artículos del tipo en el que desarrolladores, administradores y defensores del software libre confían para saber qué ocurre en el mundo de Linux. Suscríbete hoy para ayudarnos a seguir haciendo eso, y para que no tengamos que volverse buenos en marketing.
Como profesor de ingeniería biomédica, Martin Uecker quizás no encaje en el perfil de un presentador típico en Kernel Recipes. Sin embargo, es un usuario de Linux de toda la vida y trabaja en software libre para controlar escáneres de resonancia magnética (MRI). Asistió a la conferencia para hablar sobre el lenguaje de programación C, el problema específico del comportamiento indefinido en C, y si eventualmente puede convertirse en un lenguaje seguro en cuanto a memoria.
¿Por qué molestarse con C en 2026? Dijo que sigue siendo un gran lenguaje. C es portable, estable a largo plazo, ofrece compilación rápida y el código binario resultante es rápido. "Lo que ves es lo que obtienes"; es fácil mirar el código C y tener una idea de lo que realmente hará el ordenador. Hay muchas herramientas para trabajar con el lenguaje, y C se aparta cuando es necesario.
C tiene una larga historia, y eso afecta al lenguaje tal como lo vemos hoy, dijo. El estándar C89 tuvo que lidiar con una amplia variedad de hardware, incluidas máquinas con representaciones de enteros en magnitud con signo o complemento a uno, memoria segmentada, representaciones de punteros exóticas y tamaños sorprendentes para los tipos. Algunas máquinas Honeywell, por ejemplo, tenían bytes de nueve bits. Eso complicó enormemente la tarea de escribir un estándar que permitiera escribir código portable. El enfoque adoptado fue definir la semántica del lenguaje en términos de una máquina abstracta. Todas las operaciones deben ejecutarse como si se hubieran ejecutado en esa máquina abstracta, que puede no coincidir exactamente con el hardware real. El comportamiento observable del programa debe ser lo que habría hecho la máquina abstracta.
¿Puede el lenguaje de programación C hacerse seguro en cuanto a memoria?
Según Martin Uecker, aunque C tiene ventajas significativas como la portabilidad, la compilación rápida y la salida binaria predecible, su diseño histórico y la permisividad del estándar C con respecto al comportamiento indefinido —incluida la posibilidad de 'demonios nasales'— hacen que lograr la seguridad de memoria sea desafiante sin cambios sustanciales en la semántica del lenguaje.
🇫🇷 Français
Réduire les comportements indéfinis en langage C
Nous sommes mauvais en marketing — nous l'admettons. Notre force consiste à rédiger ce type d'articles sur lequel les développeurs, les administrateurs et les défenseurs du logiciel libre comptent pour savoir ce qui se passe dans le monde Linux. Abonnez-vous dès aujourd'hui pour nous aider à continuer, afin que nous n'ayons pas à devenir bons en marketing.
En tant que professeur d'ingénierie biomédicale, Martin Uecker ne correspond peut-être pas au profil d'un intervenant typique de Kernel Recipes. Il est cependant un utilisateur de Linux de longue date et travaille sur des logiciels libres destinés à contrôler les scanners d'imagerie par résonance magnétique (IRM). Il était à la conférence pour parler du langage de programmation C, du problème spécifique du comportement indéfini en C, et de savoir s'il peut éventuellement devenir un langage sûr au niveau de la mémoire.
Pourquoi se soucier de C en 2026 ? Il a déclaré que c'est toujours un excellent langage. C est portable, stable sur le long terme, offre une compilation rapide, et le code binaire résultant est rapide. "Ce que vous voyez est ce que vous obtenez" ; il est facile de regarder du code C et d'avoir une idée de ce que l'ordinateur fera réellement. Il existe de nombreux outils pour travailler avec le langage, et C se fait discret quand c'est nécessaire.
C a une longue histoire, et cela affecte le langage tel que nous le voyons aujourd'hui, a-t-il dit. Le standard C89 a dû faire face à une grande variété de matériel, y compris des machines avec des représentations d'entiers en signe-magnitude ou en complément à un, une mémoire segmentée, des représentations de pointeurs exotiques, et des tailles surprenantes pour les types. Certaines machines Honeywell, par exemple, avaient des octets de neuf bits. Cela a considérablement compliqué la tâche d'écrire un standard permettant d'écrire du code portable. L'approche adoptée a été de définir la sémantique du langage en termes de machine abstraite. Toutes les opérations doivent être exécutées comme si elles avaient tourné sur cette machine abstraite, qui peut ne pas correspondre exactement au matériel réel. Le comportement observable du programme doit être ce que la machine abstraite aurait fait.
Le langage de programmation C peut-il devenir sûr au niveau de la mémoire ?
Selon Martin Uecker, bien que C présente des avantages significatifs comme la portabilité, la compilation rapide et une sortie binaire prévisible, sa conception historique et la tolérance du standard C envers le comportement indéfini — y compris la possibilité de 'démons nasaux' — rendent l'atteinte de la sécurité mémoire difficile sans modifications substantielles de la sémantique du langage.
🇮🇳 हिन्दी
C भाषा में अनिर्दिष्ट व्यवहार को कम करना
हम मार्केटिंग में बुरे हैं — हम स्वीकार करते हैं। हमारी ताकत उन लेखों को लिखने में है जिन पर डेवलपर्स, प्रशासक और फ्री-सॉफ्टवेयर समर्थक इस बात को जानने के लिए निर्भर करते हैं कि Linux दुनिया में क्या हो रहा है। कृपया आज ही सदस्यता लें ताकि हम उसी तरह जारी रख सकें, और इसलिए कि हमें मार्केटिंग में अच्छा होने की जरूरत न पड़े।
बायोमेडिकल इंजीनियरिंग के एक प्रोफेसर के रूप में, मार्टिन उएकर शायद Kernel Recipes के एक सामान्य प्रस्तुतकर्ता के प्रोफाइल से फिट नहीं बैठते। हालाँकि, वे एक लंबे समय से Linux उपयोगकर्ता हैं, और चुंबकीय अनुनाद इमेजिंग (MRI) स्कैनरों को नियंत्रित करने के लिए फ्री सॉफ्टवेयर पर काम करते हैं। वे C प्रोग्रामिंग भाषा, C में अनिर्दिष्ट व्यवहार की विशिष्ट समस्या, और क्या इसे अंततः एक मेमोरी-सुरक्षित भाषा बनाया जा सकता है, इसके बारे में बात करने के लिए सम्मेलन में थे।
2026 में C के साथ क्यों परेशान हों? उन्होंने कहा, यह अभी भी एक महान भाषा है। C पोर्टेबल है, दीर्घकालिक रूप से स्थिर है, तेज़ कंपाइलेशन प्रदान करता है, और परिणामी बाइनरी कोड तेज़ है। "जो आप देखते हैं वही पाते हैं"; C कोड को देखना आसान है और यह समझना कि कंप्यूटर वास्तव में क्या करेगा। भाषा के साथ काम करने के लिए बहुत सारे टूल्स हैं, और C को आवश्यक होने पर रास्ता छोड़ देता है।
C की एक लंबी इतिहास है, और इससे आज हम जैसे भाषा को देखते हैं, उस पर प्रभाव पड़ता है, उन्होंने कहा। C89 मानक को हार्डवेयर की एक विस्तृत विविधता से निपटना पड़ा, जिसमें साइन-मैग्निट्यूड या वन-कम्प्लीमेंट पूर्णांक निरूपण, खंडित मेमोरी, विचित्र पॉइंटर निरूपण, और प्रकारों के आश्चर्यजनक आकार शामिल थे। कुछ Honeywell मशीनों, उदाहरण के लिए, नौ-बिट बाइट्स थे। इसने पोर्टेबल कोड लिखने को सक्षम बनाने वाले एक मानक लिखने की कार्य को बहुत जटिल बना दिया। लिए गया दृष्टिकोण भाषा के अमूर्त मशीन के संदर्भ में उसकी अर्थशास्त्र को परिभाषित करना था। सभी संचालन ऐसे ही किए जाने चाहिए जैसे वे उस अमूर्त मशीन पर चले हों, जो वास्तविक हार्डवेयर से बिल्कुल मेल न खाता हो। प्रोग्राम का प्रेक्षणीय व्यवहार वही होना चाहिए जो अमूर्त मशीन करता।
C प्रोग्रामिंग भाषा को मेमोरी-सुरक्षित बनाया जा सकता है?
मार्टिन उएकर के अनुसार, जबकि C में पोर्टेबिलिटी, तेज़ कंपाइलेशन और भविष्यवाणी योग्य बाइनरी आउटपुट जैसे महत्वपूर्ण लाभ हैं, इसका ऐतिहासिक डिज़ाइन और C मानक द्वारा अनिर्दिष्ट व्यवहार — जिसमें 'नासल डेमॉन्स' की संभावना भी शामिल है — की अनुमति, भाषा के अर्थशास्त्र में बड़े बदलावों के बिना मेमोरी सुरक्षा प्राप्त करना चुनौतीपूर्ण बनाता है।
🇮🇩 Bahasa Indonesia
Mengurangi perilaku tak terdefinisi dalam bahasa C
Kami buruk dalam pemasaran — kami akui. Kekuatan kami adalah menulis artikel semacam itu yang bergantung pada pengembang, administrator, dan pendukung perangkat lunak bebas untuk mengetahui apa yang terjadi di dunia Linux. Silakan berlangganan hari ini untuk membantu kami terus melakukannya, dan agar kami tidak perlu menjadi baik dalam pemasaran.
Sebagai profesor teknik biomedis, Martin Uecker mungkin tidak sesuai dengan profil presenter tipikal di Kernel Recipes. Namun, ia adalah pengguna Linux lama, dan bekerja pada perangkat lunak bebas untuk mengontrol pemindai pencitraan resonansi magnetik (MRI). Ia hadir di konferensi untuk berbicara tentang bahasa pemrograman C, masalah spesifik perilaku tak terdefinisi dalam C, dan apakah pada akhirnya dapat dijadikan bahasa yang aman memori.
Mengapa repot-repot dengan C di 2026? Ia mengatakan, itu masih bahasa yang hebat. C dapat dipindahkan, stabil dalam jangka panjang, menawarkan kompilasi cepat, dan kode biner hasilnya cepat. "Apa yang Anda lihat adalah apa yang Anda dapatkan"; mudah melihat kode C dan memiliki gambaran tentang apa yang sebenarnya akan dilakukan komputer. Ada banyak alat untuk bekerja dengan bahasa ini, dan C mundur ketika diperlukan.
C memiliki sejarah panjang, dan itu memengaruhi bahasa sebagaimana kita melihatnya hari ini, katanya. Standar C89 harus menghadapi beragam perangkat keras, termasuk mesin dengan representasi bilangan bulat tanda-magnitudo atau komplemen satu, memori tersegmentasi, representasi pointer eksotis, dan ukuran mengejutkan untuk tipe. Beberapa mesin Honeywell, misalnya, memiliki byte sembilan bit. Itu sangat mempersulit tugas menulis standar yang memungkinkan penulisan kode yang dapat dipindahkan. Pendekatan yang diambil adalah mendefinisikan semantik bahasa dalam hal mesin abstrak. Semua operasi harus dieksekusi seolah-olah telah berjalan pada mesin abstrak itu, yang mungkin tidak persis sesuai dengan perangkat keras aktual. Perilaku yang dapat diamati dari program haruslah apa yang akan dilakukan mesin abstrak.
Apakah bahasa pemrograman C dapat dibuat aman memori?
Menurut Martin Uecker, meskipun C memiliki keunggulan signifikan seperti portabilitas, kompilasi cepat, dan output biner yang dapat diprediksi, desain historisnya dan pengakuan standar C terhadap perilaku tak terdefinisi — termasuk kemungkinan 'demon hidung' — membuat pencapaian keamanan memori menjadi menantang tanpa perubahan substansial pada semantik bahasa.
🇯🇵 日本語
C言語における未定義動作の削減
私たちはマーケティングが苦手です——それを認めましょう。私たちの強みは、開発者、管理者、フリーソフトウェア支持者がLinuxの世界で何が起きているかを知るために依存しているような記事を書くことです。今日すぐに購読して、私たちがそれを続けられるよう支援し、マーケティングが得意になる必要がなくなるよう助けてください。
生物医学工学の教授であるMartin Uecker氏は、おそらくKernel Recipesの典型的な発表者のプロフィールには当てはまらないでしょう。しかし、彼は長年のLinuxユーザーであり、磁気共鳴画像法(MRI)スキャナを制御するためのフリーソフトウェアに取り組んでいます。彼はCプログラミング言語、Cにおける未定義動作という具体的な問題、そしてそれが最終的にメモリセーフな言語になる可能性があるかどうかについて話すためにカンファレンスに参加しました。
2026年になぜCにこだわるのでしょうか?彼は、まだ素晴らしい言語だと述べました。Cは移植可能で、長期的に安定しており、高速なコンパイルを提供し、生成されるバイナリコードも高速です。「あなたが目にするものが得られるもの」——Cコードを見て、コンピュータが実際に何をするのかの大まかなイメージを持つのは簡単です。その言語で作業するための多くのツールがあり、必要に応じてCは後ろに下がります。
Cには長い歴史があり、それが今日私たちが目にする言語に影響を与えていると彼は言いました。C89標準は、符号付き絶対値または1の補数整数表現、セグメント化メモリ、奇妙なポインタ表現、そして型に対する驚くべきサイズを含む、幅広いハードウェアの多様性に対処する必要がありました。例えば、いくつかのHoneywellマシンは9ビットバイトを持っていました。これは、移植可能なコードの記述を可能にする標準を書くという作業を大幅に複雑にしました。採用されたアプローチは、言語のセマンティクスを抽象機械の用語で定義することでした。すべての操作は、その抽象機械上で実行されたかのように実行されなければなりません。その抽象機械は実際のハードウェアと正確に一致しない場合があります。プログラムの観測可能な動作は、抽象機械が実行したものでなければなりません。
Cプログラミング言語をメモリセーフにすることはできますか?
Martin Uecker氏によると、Cには移植性、高速なコンパイル、予測可能なバイナリ出力などの重要な利点がありますが、その歴史的な設計と、C標準が未定義動作——「鼻の悪魔」の可能性を含む——を認めていることは、言語のセマンティクスに大幅な変更を加えずにメモリセーフを実現することを困難にしていると述べています。
🇧🇷 Português
Reduzir comportamento indefinido na linguagem C
Somos ruins em marketing — admitimos. Nossa força é escrever o tipo de artigos no qual desenvolvedores, administradores e defensores de software livre confiam para saber o que está acontecendo no mundo Linux. Assine hoje para nos ajudar a continuar fazendo isso, e para que não tenhamos que ficar bons em marketing.
Como professor de engenharia biomédica, Martin Uecker talvez não se encaixe no perfil de um apresentador típico do Kernel Recipes. No entanto, é um usuário de Linux de longa data e trabalha em software livre para controlar scanners de ressonância magnética (MRI). Esteve na conferência para falar sobre a linguagem de programação C, o problema específico do comportamento indefinido em C, e se eventualmente pode se tornar um linguagem segura em relação à memória.
Por que se preocupar com C em 2026? Disse que ainda é uma ótima linguagem. C é portátil, estável a longo prazo, oferece compilação rápida, e o código binário resultante é rápido. "O que você vê é o que você obtém"; é fácil olhar para o código C e ter uma ideia do que o computador realmente fará. Há muitas ferramentas para trabalhar com a linguagem, e C se afasta quando necessário.
C tem uma longa história, e isso afeta a linguagem como a vemos hoje, disse. O padrão C89 teve que lidar com uma ampla variedade de hardware, incluindo máquinas com representações de inteiros em sinal-magnitude ou complemento de um, memória segmentada, representações exóticas de ponteiros, e tamanhos surpreendentes para os tipos. Algumas máquinas Honeywell, por exemplo, tinham bytes de nove bits. Isso complicou enormemente a tarefa de escrever um padrão que permitisse escrever código portátil. A abordagem adotada foi definir a semântica da linguagem em termos de uma máquina abstrata. Todas as operações devem ser executadas como se tivessem rodado nessa máquina abstrata, que pode não corresponder exatamente ao hardware real. O comportamento observável do programa deve ser o que a máquina abstrata teria feito.
A linguagem de programação C pode ser tornada segura em relação à memória?
De acordo com Martin Uecker, embora C tenha vantagens significativas como portabilidade, compilação rápida e saída binária previsível, seu design histórico e a permissão do padrão C para comportamento indefinido — incluindo a possibilidade de 'demônios nasais' — tornam alcançar segurança de memória desafiador sem mudanças substanciais na semântica da linguagem.
🇷🇺 Русский
Сокращение неопределённого поведения в языке C
Мы плохо умеем заниматься маркетингом — признаём это. Наша сила — писать статьи такого рода, на которые полагаются разработчики, администраторы и сторонники свободного ПО, чтобы знать, что происходит в мире Linux. Подпишитесь сегодня, чтобы помочь нам продолжать это, и чтобы нам не пришлось стать хорошими в маркетинге.
Как профессор биомедицинской инженерии, Мартин Уэкер, возможно, не вписывается в профиль типичного докладчика Kernel Recipes. Однако он давний пользователь Linux и работает над свободным ПО для управления сканерами магнитно-резонансной томографии (МРТ). Он был на конференции, чтобы поговорить о языке программирования C, конкретной проблеме неопределённого поведения в C, и о том, можно ли в конечном итоге сделать его языком, безопасным с точки зрения памяти.
Зачем вообще заниматься C в 2026 году? Он сказал, что это всё ещё отличный язык. C переносим, стабилен в долгосрочной перспективе, обеспечивает быструю компиляцию, а результирующий бинарный код быстр. "Что видишь, то и получаешь"; легко посмотреть на код C и иметь представление о том, что на самом деле сделает компьютер. Существует множество инструментов для работы с языком, и C отходит на второй план, когда это необходимо.
У C долгая история, и это влияет на язык таким, каким мы видим его сегодня, сказал он. Стандарт C89 должен был справляться с широким разнообразием аппаратного обеспечения, включая машины с представлениями целых чисел со знаком-модулем или обратным кодом, сегментированной памятью, экзотическими представлениями указателей и удивительными размерами типов. Некоторые машины Honeywell, например, имели девятибитные байты. Это значительно усложнило задачу написания стандарта, который позволил бы писать переносимый код. Подход, который был принят, заключался в определении семантики языка через абстрактную машину. Все операции должны выполняться так, как если бы они работали на этой абстрактной машине, которая может не точно соответствовать реальному оборудованию. Наблюдаемое поведение программы должно быть таким, каким оно было бы на абстрактной машине.
Можно ли сделать язык программирования C безопасным с точки зрения памяти?
По словам Мартина Уэкера, хотя C имеет значительные преимущества, такие как переносимость, быстрая компиляция и предсказуемый бинарный вывод, его исторический дизайн и допущение стандартом C неопределённого поведения — включая возможность 'носовых демонов' — делают достижение безопасности памяти сложным без существенных изменений в семантике языка.
🇨🇳 简体中文
减少C语言中的未定义行为
我们在营销方面表现不佳——我们承认这一点。我们的优势在于撰写开发者、系统管理员和自由软件支持者赖以了解 Linux 世界动态的文章。请今天订阅,帮助我们继续这样做,这样我们就不必擅长营销。
作为生物医学工程教授,Martin Uecker 或许不符合 Kernel Recipes 典型演讲者的形象。不过,他是一名长期使用 Linux 的用户,并致力于开发用于控制磁共振成像(MRI)扫描仪的自由软件。他出席此次会议是为了谈论 C 编程语言、C 中未定义行为这一具体问题,以及 C 最终能否成为一种内存安全的语言。
2026 年为何还要关注 C?他说,它仍然是一门优秀的语言。C 具有可移植性、长期稳定、编译速度快,生成的二进制代码运行迅速。“所见即所得”;查看 C 代码就能大致了解计算机实际会做什么。围绕该语言的工具很多,而且在必要时 C 会退居幕后。
C 拥有悠久的历史,这影响了我们今天所见的语言,他说。C89 标准必须应对各种各样的硬件,包括采用符号-绝对值或反码整数表示、分段内存、奇特指针表示以及类型大小令人惊讶的机器。例如,一些 Honeywell 机器拥有九位字节。这极大地增加了编写能够支持可移植代码的标准这一任务的难度。所采取的方法是,用抽象机来定义语言的语义。所有操作都应如同在该抽象机上运行一样执行,而该抽象机可能并不完全匹配实际硬件。程序的可观察行为必须与抽象机所执行的行为一致。
C 编程语言能否实现内存安全?
据 Martin Uecker 称,尽管 C 具有可移植性、编译速度快和二进制输出可预测等显著优势,但其历史设计以及 C 标准对未定义行为(包括“鼻中恶魔”的可能性)的允许,使得在不大幅改变语言语义的情况下实现内存安全颇具挑战。