Projet

Général

Profil

SOP 001-Programmation » Historique » Version 13

Patrice Nadeau, 2015-09-16 20:03

1 1 Patrice Nadeau
h1. SOP 001-Programmation
2
3
Mes standards autant au niveau du style que de la documentation.
4
5 11 Patrice Nadeau
La plate-forme (logiciel et matériel) est documenté dans le [[SOP_002-Environnement_informatique]].
6 1 Patrice Nadeau
7
{{lastupdated_at}} {{lastupdated_by}}
8
9
---
10
11
{{toc}}
12
13
h2. Diagrammes
14
15
Les représentations des différents processus d’un programme ou d’un circuit.
16
17
Les diagrammes DOIVENT être faits avec le logiciel Dia.
18
Ils PEUVENT être exportés en d’autre format.
19
20
h2. Système de gestion de version
21
22
Le logiciel "Git":http://www.git-scm.com/ DOIT être utilisé.
23
24
La version DOIT être en format: _majeur.mineur.revision_.
25
Les nombres majeur, mineur NE DOIVENT PAS contenir de zéro non significatif et DEVRAIT se limiter à deux chiffres.
26
27
Ex.
28
> Version 1.2.06
29
30
Les modifications DOIVENT se faire avec _git commit_, de la manière suivante :
31
* nom du fichier modifié,
32
* 1 espace,
33
* nom de l’item modifié entre parenthèses,
34
* un deux- points (<notextile>:</notextile>) sans espace avec l’item précédent,
35
* 1 espace,
36
* le texte du changement en anglais, commençant par une majuscule, au présent,
37
* un point (.)
38
39
Ex. :
40
> Modification ajouté manuellement
41
<pre><code class="bash">
42
git commit -m "usart.c (usart_Init): Add a new variable ctr."
43
</code></pre>
44
> Modification par un éditeur texte
45
<pre><code class="bash">
46
git commit
47
</code></pre>
48
49
Si les commit sont fait sans l’option *-m*, chaque fichier DOIT être séparé par une ligne vide.
50
51
h2. Code source
52
53
Les différents type de langage et de script décrit dans ce SOP.
54
55
h3. Généralités
56
57
h4. Langue
58
59
La langue (macros, variables, fonctions, commentaires, etc...) DOIT être l’anglais.
60
61
h4. Commentaires
62
63
Les commentaires DOIVENT être :
64
* sur la ligne précédent l’item à documenter
65
* en minuscules et commencer par une majuscule
66
67
68
h4. Nombre magique
69
70
L’utilisation de "nombre magique":http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Unnamed_numerical_constants ne DOIT PAS être utilisé directement dans le code.
71
Il DOIVENT être définis dans une macro ou une variable globale.
72
73
h2. C
74
75
Le langage C, version C99 (ISO/IEC 9899:1999) utilisé avec le compilateur GCC.
76
77
h3. Commentaires
78
79
Les commentaires ne devant pas être inclus dans une documentation, DOIVENT être de style « C » :
80
81
<pre><code class="c">
82
/* Une seule ligne... */
83
84
...
85
86
/*
87
* Sur
88
* plusieurs
89
* lignes
90
*/
91
</code></pre>
92
93
h3. Doxygen
94
95
Chaque item DOIT être documentés de manière à générer une documentation avec le logiciel "Doxygen":http://www.stack.nl/~dimitri/doxygen/index.html.
96
97
Seulement les items définis dans les fichiers d’en-tête sont documentés par défaut.
98
Un commentaire Doxygen commence par *<notextile> /** </notextile>* , le compilateur le comprenant comme un commentaire ordinaire.
99
100
Les règles typographiques du [[SOP_000-Documentation]] s’appliquent :
101
* Gras (*@b*) : Items devant être inscrit tel quel.
102
* Italique & emphase (*@e*) : Items à remplacer par un choix ou nécessitant une attention particulière.
103 10 Patrice Nadeau
104 9 Patrice Nadeau
> Doxygen version &ge; 1.8.8 : Le bogue "737472":https://bugzilla.gnome.org/show_bug.cgi?id=737472 oblige de forcer le langage de la fonction dans l’exemple si on ne veut pas de numéro de ligne.
105 1 Patrice Nadeau
106
Les items DOIVENT être inscrit dans cet ordre :
107
<pre><code class="c">
108
/**
109 6 Patrice Nadeau
* @brief Short description
110
* @param[in,out] var Description. @n Possible values :
111
* − @b value1
112
* − @b value2
113
* @return
114
* @retval @b value Description
115
* @par Example :
116 1 Patrice Nadeau
* Example Title
117 7 Patrice Nadeau
* @code{.c}
118 1 Patrice Nadeau
* ...
119
* @endcode
120
* @pre Requirements
121
* @post Changes after the call to this function
122
* @see See also ...
123
* @note
124
* @warning
125
* @bug
126
* @todo
127
*/
128
</code></pre>
129
130
Des *@todo*, *@warning* et *@bug* supplémentaires PEUVENT être ajoutés dans le code.
131
L’item *@brief* DOIT toujours exister.
132
133
h3. Code
134
135
Le code est dans le style K&R, variante 1TBS
136
* Le « tab » DOIT être équivalent à 4 espaces.
137
* Le « backslah » DOIT être utilisé pour les lignes de plus de 80 caractères.
138
* Une instruction par ligne.
139
* Un espace avant et après un opérateur sauf pour les opérateurs « "unary":http://en.wikipedia.org/wiki/Unary_operation ».
140
141
One True Brace Style
142
<pre><code class="c">
143
int fonction (void)
144
{
145
    int x;
146
    /* the comment goes here, before the loop */
147
    if (var != 1) {
148
        x = x + 1;
149
        y++;
150
        printf("This is a long\
151
        line that should be splitted");
152
    } else {
153
        /** @warning this is a Doxygen warning */
154
        x--;
155
    }
156
    return(0);
157
}
158
</code></pre>
159
160
h4. Fichier entête
161
162
Avertissement
163
>Le gabarit template.h DOIT être utilisé.
164
165
Les fichier « header » DOIVENT contenir les déclarations des fonctions, macros et la partie « mainpage » de Doxygen.
166
167
Le nom du fichier DOIT être composé de la manière suivante :
168
* en minuscule
169
* 8 caractères maximum
170
* l’extension DOIT être *.h*
171
172
Une définition macro DOIT être faite pour éviter de ré-inclure le fichier.
173
La macro DOIT être dans le format *_fichier_h*
174
<pre><code class="c">
175
#ifndef _usart_h
176
#define _usart_h
177
...
178
#endif /*_usart.h*/
179
</code></pre>
180
181
h4. Fichier source
182
183
Le nom du fichier DOIT être composé de la manière suivante :
184
* en minuscule
185
* 8 caractères maximum
186
* l’extension DOIT être *.c*
187
188
h4. Librairies
189
190
Fichiers comprenant plusieurs déclarations et définitions reliés entre eux.
191
192
* Le nom DOIT respecter les standards ([[SOP_001-Programmation#Fichiers-Entêtes|1]] & [[SOP_001-Programmation#Fichiers-Sources|2]]) et être significatifs.
193
* Un fichier d’entête DOIT toujours exister.
194
* Les items sont précédés du nom de la librairie (minuscule) et séparés par un « underscore » (_).
195
196
L’utilisation de macros DOIT être utilisé au lieu de constates globales.
197
Il NE DEVRAIT PAS exister de de variables globales.
198
199
h4. Déclarations locales
200
201
Une déclaration n’ayant qu’une visibilité locale DOIT être précédé d’un « underscore » (_) et être de classe *static*.
202
203
<pre><code class="c">
204
/**
205
* @brief Local function
206
**/
207
static void _LocalFunc(void)
208
{
209
...
210
return;
211
}
212
</code></pre>
213
214
h4. Items désuets
215
216
Les déclarations ne devant plus être utilisés, DOIVENT générer un message lors de la compilation (*-Wall*) si un appel est effectué.
217
218
L’attribut *<notextile> __attribute__((deprecated)) </notextile>* DOIT être ajouté à la déclaration.
219
La documentation DOIT indiquer les substituts à utiliser.
220
<pre><code class="c">
221
/**
222
* @brief OldFunction
223
* @detail will generate a warning if used
224
* @see @b NewFunction
225
*/
226
int OldFunction(void) __attribute__((deprecated));
227
</code></pre>
228
229
h4. Constantes
230
231
La déclaration DOIT inclure aussi la définition.
232
233
Utilisé au lieu d’une macro quand le type ou la visibilité de la variable doit être définis.
234
* En majuscule
235
* Séparé par un «underscore» (_) si contient plusieurs mots
236
* De classe _static_ ou _extern_ selon le besoin
237
238
<pre><code class="c">
239
/** 
240
 * @name List of constants
241
 * @{
242
 */
243
244
/**
245
* @brief Local const
246
*/
247
static int _PI = 3.15;
248
/**
249
* @brief The initialization string of the project
250
*/
251
static const char INIT_STR[6] = {'P', 'O', 'W', 'E', 'R'};
252
/**
253
* @brief Global const in the random library
254
*/
255
extern int random_MAX = 25;
256
257
/**
258
 * @}
259
 */
260
</code></pre>
261
262
h4. Typedef
263
264 12 Patrice Nadeau
Format
265
* En minuscule, suivie de *_t*
266
267 13 Patrice Nadeau
Définition de typedef
268 12 Patrice Nadeau
<pre><code class="c">
269
/** Unsigned integer 8 bits */
270
typedef unsigned int new_t
271
/** Type of structure in the ds1305 library */
272
typedef struct {
273
	/** @brief last two digits : &ge; 00, &le; 99 */
274
	uint8_t year;
275
	/** @brief 01 - 12 */
276
	uint8_t month;
277
	/** @brief 01 - 31 */
278
	uint8_t date;
279
	/** @brief 1 - 7 */
280
	uint8_t day;
281
	/** @brief 00 - 23 */
282
	uint8_t hours;
283
	/** @brief 00 - 59 */
284
	uint8_t minutes;
285
	/** @brief 00 - 59 */
286
	uint8_t seconds;
287
} ds1305_time_t;
288
</code></pre>
289 1 Patrice Nadeau
290
h4. Variables
291
292
Format
293
* En minuscule.
294
* Séparé par un « underscore » (_) si contient plusieurs mots.
295
296
Définition de variables
297
<pre><code class="c">
298
/** @brief Local variable */
299
int _ctr;
300
/** @brief Global variable from the random librairy */
301
int random_ctr;
302
</code></pre>
303
304
h4. Structures
305
306
Format
307
* En minuscule, séparé par des «underscores» si nécessaire.
308
309
Définition de structures
310
<pre><code class="c">
311
/**
312
* @brief Structure for a local menu
313
* @see MenuSelect
314
*/
315
struct menu {
316
/** @brief Character used for the item */
317
char choice;
318
/** @brief Description of the item */
319
char *item;
320
};
321
</code></pre>
322
323
h4. Fonctions
324
325
Le nom est formé d’une lettre majuscule pour chacune des premières lettres des mots.
326
327
Le nom DOIT être dans un deux formats suivants :
328
* ActionItemAttribut, où _Action_ signifie :
329 5 Patrice Nadeau
** *Get* : Lis un registre
330
** *Read*, *Write* : Lis ou écris dans un fichier
331
** *Set* : Écris une valeur prédéfini dans un registre
332
** *Init* : Fonction d’initialisation
333 1 Patrice Nadeau
* isItemEtat
334 5 Patrice Nadeau
** *is* : Verifie si _Item_ est dans l’état _Etat_
335 1 Patrice Nadeau
336
Exception
337
> Les fonctions définies dans une librairie de bas niveau pour du matériel (« driver »). Dans ce cas, le nom définis dans le « datasheet » aura préséance. Ex. ReadRegister.
338
339
Une fonction DEVRAIT retourner une valeur. 
340
341
Dans le cas d'un « oui/non », la valeur DOIT être :
342
* Succès : *0* 
343
* Erreur : *1*
344
> L'utilisation d'un type booléen (*true* & *false*) est permise avec *<stbool.h>* (C99).
345
346
Dans le cas d'une fonction retournant un pointeur :
347
* Erreur : *NULL* 
348
* autre valeur  : adresse du pointeur
349
350
351
Définition de fonctions
352
<pre><code class="c">
353
/**
354
* @brief Check if a timer is set
355
* @param[in] nb Timer number. @n Possible values :
356
* − @b TIMER_1
357
* − @b TIMER_2
358
* @return
359
* @retval true Timer @e nb is set
360
* @retval false Timer @e nb is NOT set
361
* @par Example :
362
* Check if the timer is set
363
* @code{.c}
364
* ...
365
* result = isTimerSet();
366
* ...
367
* @endcode
368
* @pre TimerInit
369
**/
370
static bool isTimerSet(uint8_t nb);
371
/**
372
* @brief Set the led to green
373
**/
374
SetLedColor(GREEN);
375
/**
376
* @brief Set register of the chip XYZ
377
*
378
* The name does not follow the standards but does match the datatsheet
379
* This is a local function not meant to be called outside this librairy
380
**/
381
static void _WriteReg(void);
382
</code></pre>
383
384
h3. Macros
385
386
Les directives du préprocesseur C.
387
388
* Utilisé dans le code source et les fichiers entête.
389
* DOIT toujours commencer à la colonne 0.
390
391
h4. include
392
393
Pour inclure d’autres fichier comme les fichiers entête.
394
>N’est pas documenté dans Doxygen.
395
396
h4. ifdef / ifndef
397
398
Surtout utiliser pour des options de compilation sur différentes plateforme.
399
>N’est pas documenté dans Doxygen.
400
401
<pre><code class="c">
402
#ifndef usart_AVR
403
#error "usart.h is not supported on this AVR !"
404
#endif
405
</code></pre>
406
407
h4. error
408
409
Affiche une erreur et arrête la compilation
410
>N’est pas documenté dans Doxygen.
411
412
<pre><code class="c">
413
#ifndef __test__
414
#error "Error !"
415
#endif
416
</code></pre>
417
418
h4. #warning
419
420
Affiche une erreur mais n’arrête la compilation
421
>N’est pas documenté dans Doxygen.
422
423
<pre><code class="c">
424
#ifndef __test__
425
#warning "Warning !"
426
#endif
427
</code></pre>
428
429
h4. define 
430
431
Définis une valeur au moment de la compilation.
432
* Format
433
** En majuscule.
434
** Séparé par un «underscore» si contient plusieurs mots.
435
* Doxygen
436
** @brief
437
** @name pour les listes de macros (regroupement dans la documentation)
438
439
Définition de macros
440
<pre><code class="c">
441
/**
442
* @name Mathematical macros listed together
443
* @{
444
*/
445
/** @brief Value for PI */
446
#define _PI 3.14
447
/** @brief Another number */
448
#define _MAGIC_NUMBER 42
449
/**
450
* @}
451
*/
452
/** @brief Even parity */
453
#define usart_PARITY_EVEN 'e'
454
</code></pre>
455
456
h3. Atmel AVR
457
458
Particularités pour les micro-contrôleurs AVR d’Atmel.
459
460
* Progmem : Pour mettre une fonction en Flash au lieu de SRAM.
461
** Le nom de la fonction est suivie de *_P*.
462
* main : Ne revient jamais à un niveau supérieur.
463
** Définir la fonction main avec l’attribut *noreturn*.
464 3 Patrice Nadeau
** La boucle sans fin la plus optimisé est le *for (;;)*.
465 1 Patrice Nadeau
* Atomic : Opérations ne devant pas être interrompus.
466
467
Particularités pour AVR
468
<pre><code class="c">
469
/**
470
* @brief Progmem function
471
* @return An unsigned 8 bits integer
472
*/
473
uint_8t PrintString_P()
474 4 Patrice Nadeau
475 1 Patrice Nadeau
/* main function */
476
void main(void) __atribute__((noreturn))
477
{
478
    ...
479
    /* never return */
480
    for (;;) {
481
    }
482
}
483
484
/* atomic operations */
485
#ifndef S_SPLINT_S
486
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
487
/* 
488
* operations that must not be interupted
489
* like loading a 16 bit register with a 8 bit register 
490
*/
491
}
492
#endif
493
</code></pre>
494
495
h3. Distribution
496
497
Les fichiers suivants DOIVENT être inclus dans une distribution en format *tar.gz*.
498
* ChangeLog
499
* README
500
* Files.lst
501
* Makefile
502
* Makefile.mk
503
* LICENSE.txt
504
* *.c
505
* *.h
506
* projet.pdf (généré par Doxygen)
507
508
Avec mon makefile :
509
<pre><code class="bash">
510
make dist
511
</code></pre>
512
513
h3. Modifications
514
515
Un changement à un fichier (source ou en-tête), doit se refléter dans _Git_.
516
517
Chaque changement est fait avec :
518
<pre><code class="bash">
519
git add nom_fichier
520
git commit
521
</code></pre>
522
523
La ligne DOIT 
524
* être au temps présent
525
* être en anglais
526
* se termine par un point
527
* être dans le format suivant :
528
> La partie _section_ est facultative
529
530
<pre><code class="text">
531
fichier1 (fonction) <section>: 
532
Ajoute une description au temps présent.
533
Décrire les bogues réglés si il y en avaient.
534
</code></pre>
535
536
h3. Changelog
537
538
La somme de toutes les modification doivent apparaitre dans un fichier « changelog ».
539
> Le standard seras celui GNU : http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
540
541
Ce fichier doit s'appeler *ChangeLog* et DOIT être généré à partir de _Git_ (les doubles espaces ne sont pas une erreur de frappe :
542
<pre><code class="bash">
543
git log --no-merges --format="%ad  %an  <%aE> %n * %B" --date=short > ChangeLog
544
</code></pre>
545
546
h3. Validation du code
547
548
Le logiciel _splint_ est utilisé.
549
* Un « typecast » DOIT être utilisé lorsque détecté.
550
* L’utilisation du typecast *void* DOIT être utilisé lorsque qu’une fonction retourne un résultat non utilisé.
551
552
h2. Makefile
553
554
h2. Nagios
555
556
h3. Plugins
557
558
https://nagios-plugins.org/doc/guidelines.html
559
560
Un message d'une ligne (< 80 caractères) DOIT être retourné via _STDOUT_ dans le format
561
> *SERVICE STATUS:* texte
562
563
Les codes de retour sont les suivants:
564
|_. Valeur |_. Service Status |_. Description |
565
| 0 | OK | Le service fonctionne |
566
| 1 | Warning | Le service fonctionne, problème avec le seuil de la valeur _Warning_ |
567
| 2 | Critical | Le service ne fonctionne pas ou problème avec le seuil de la valeur _Critical_  |
568
| 3 | Unknow | Arguments non valides ou erreur interne (fork, tcp socket)|
569
570
Les arguments suivants DOIVENT être fournis
571
* *-H* (*--hostname*) :
572
* *-w* (*--warning*) :
573
* *-c* (*--critical*) :
574
* *-V* (*--version*) :
575
* *-h* (*--help*) :
576
577
L'argument _--help_ DOIT aussi appeler l'argument _--version_.
578
579
En _C_, les fonctions suivantes DOIT être utilisées :
580
* _print_revision_ (utils.c)
581
* _print_help_
582
* _getopt_long_ (getopt.h)
583
584
h2. Puppet
585
586
h3. Généralités
587
588
Inspiré des recommandations disponible au http://docs.puppetlabs.com/guides/style_guide.html.
589
* Tabulation : 2 espaces
590
*  Largeur : 80 caractères (« backslah » (\) pour séparer une longue ligne).
591
* Commentaires : Style #
592
* Guillemets
593
** Simple : Pour une « string » sans variables.
594
** Double : Pour une « string » avec variables ayant besoin d’être extrapolé.
595
*** La variable doit être entourée des symboles *<notextile>{</notextile>* et *<notextile>}</notextile>*.
596
* Nom des ressources : DOIVENT être entouré du symbole *<notextile> ’ </notextile>*.
597
* Alignement de => : DOIT être aligné dans un même paragraphe.
598
* Ordre : Si l’attribut _ensure_ doit être inclus, il DOIT être le premier.
599
* Lien symbolique : DOIT être déclaré avec *ensure => link*
600
601
Ex. :
602
<pre><code class="ruby">
603
file { '/var/log/syslog':
604
ensure => link,
605
target => '/var/log/messages',
606
}
607
</code></pre>
608
609
* File mode : 
610
** 4 chiffres
611
** simple guillemet
612
* Variables
613
** lettres
614
** chiffres
615
** « underscore »
616
617
h3. Documentation
618
619
http://docs.puppetlabs.com/learning/modules2.html#module-documentation
620
621
Format Rdoc (http://rdoc.rubyforge.org/RDoc/Markup.html)
622
* Bloc de commentaires qui commence sur la première ligne du fichier
623
* Titre avec le symbole *<notextile>=</notextile>*
624
* Séparation avec le symbole *<notextile>-</notextile>*
625
* Emphase (mot entouré du symbole)
626
** * : gras
627
** _ : souligné
628
** + : Police de caractères pour le code
629
* Sections
630
** = Class:
631
** == Parameters:
632
** == Requires:
633
** == Sample Usage:
634
* Classe
635
** Une classe par fichier « manifest »
636
637
h2. Script
638
639
h3. Bash
640
641
<pre><code class="bash">
642
#/bin/bash
643
644
function print_revision {
645
}
646
647
function print_help {
648
    print_revision
649
}
650
</code></pre>
651
652
h3. Perl
653
654
<pre><code class="perl">
655
656
</code></pre>
657
658
h3. PowerShell
659
660
Version 4.0. Supporte :
661
* Windows 8.1 (natif)
662
* Windows Server 2012 R2 (natif)
663
* Windows 7 SP1
664
* Windows Server 2008 R2 SP1
665
* Windows Server 2012
666
667
h4. Fichier
668
669
Le fichier DOIT être composé de la manière suivante :
670
* L’extension est .ps1
671
* Une longue ligne peux être séparée avec un « back tick » (‘).
672
673
h4. Commentaires
674
675
L’aide est accéder par _Get-Help_
676
<pre>
677
#REQUIRES -Version 2.0
678
<#
679
.SYNOPSIS
680
A brief description of the function or script.
681
This keyword can be used only once in each topic.
682
.DESCRIPTION
683
A detailed description of the function or script.
684
This keyword can be used only once in each topic.
685
.NOTES
686
File Name
687
: xxxx.ps1
688
Author
689
:
690
Prerequisite
691
: PowerShell V2 over Vista and upper.
692
Copyright 2011 -
693
.LINK
694
Script posted over:
695
http://
696
.EXAMPLE
697
Example 1
698
.EXAMPLE
699
Example 2
700
#>
701
</pre>
702
703
h2. Vim
704
705
* Entête (en commentaires)
706
** Titre
707
** Last Change:
708
** Maintainer:
709
** License: This file is placed in the public domain.
710
* Autre mots reconnus
711
** BUG: (Error:)
712
** TODO:
713
** Note:
714
** FIXME
715
716
h2. Références
717
718
Références ayant servis à ce document.
719
720
"ChangeLog":http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
721
"GNU deprecated attribute":http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/Type-Attributes.html